反转链表是一道比较简单的题,主要考察的是对链表数据结构的理解和双指针应用,比较容易出错的地方是指针的移动顺序。在练习的过程中想到了一个比较形象的表示方法,于是记录下来。
# 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 = None
cur = head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return 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。