leetcode 練習–反轉鏈表

最近開始學習數據結構和演算法的學習,也自然開始在 leetcode 上練習,所以每周大概會分享做過的leetcode 練習,盡量做到每天更新一道題目。

作為 leetcode 練習筆記的第一道題目,選擇了一道很經典的題目,反轉鏈表。這是 leetcode 上的 206 題,鏈接如下:

//leetcode-cn.com/problems/reverse-linked-list/

示例

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

思路

反轉一個單鏈表,首先肯定需要遍歷這個單鏈表,在遍歷的時候就希望修改當前結點的 next 指針,指向其前一個結點,因此肯定需要一個保存前一個結點的變數,也就是反轉後鏈表的頭部指針。

實現的思路應該是這樣的:

  1. 首先定義一個 prev 保存前一個結點,curr 保存當前結點,然後還有一個 nxt 保存下一個結點,其中 prev 就是最終的反轉鏈表的頭結點;
  2. 先讓 nxt 保存下一個結點;
  3. 然後改變 currnext 指針,指向前一個結點,即 prev ;
  4. 接著,讓 prev = curr
  5. 最後,就是讓 curr = nxt,指向下一個結點
  6. 重複 2-5 步,直到當前結點為空。

下圖展示了上述幾個步驟的過程:

實現

利用 python 的特性,實現的時候關鍵程式碼其實就一行即可。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        pre, cur = None, head
        while cur:
            pre, pre.next, cur = cur, pre, cur.next
        return pre

github地址:

//github.com/ccc013/DataStructe-Algorithms_Study/blob/master/Python/Leetcodes/linked_list/206_Reverse_Linked_List.py