反轉鏈表是一道比較簡單的題,主要考察的是對鏈表數據結構的理解和雙指針應用,比較容易出錯的地方是指針的移動順序。在練習的過程中想到了一個比較形象的表示方法,于是記錄下來。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = head while cur:tmp = cur.next cur.next = prepre = curcur = tmpreturn pre
1. 首先pre的定義是建立在對鏈表的理解上的,最終鏈表的head因為沒有next節點,所以就是None。這個pre既是在后面表示前一個節點,又是在初始化時表示了反轉后鏈表的尾部,這樣就能理解為什么要定義pre。
2. cur表示當前節點,之后的while循環也是建立在cur上的,當cur為none了,表示這個鏈表遍歷到尾部了。
3. tmp = cur.next和cur.next = pre這兩句可以按照下面的圖片理解:
????????本來A->cur->C是一個鏈表,如第一行;
????????tmp = cur.next其實相當于把cur->C的鏈接砍斷,把C先存到別的地方去,如第二行;
????????cur.next = pre相當于把A->cur的鏈接砍斷后添加了一個反向的鏈接,如第三行和第四行;
? ? ? ? 這兩個操作后實現了cur->A,那么接下來的步驟就是該把C->cur了。

4. pre = cur和cur = tmp就是在把指針向后移,重復上面3的步驟,把C->cur。注意:在這個操作后pre就指向了cur,cur已經指向tmp,所以最后return的是pre而不是cur。