今日做题有感,链表其实就像玩3A游戏存档。你不知道接下来的关卡内容是什么,你也不能通过任何index直接获取某个节点的内容。唯一的办法就是通过当前存档,去继续游玩获取下个节点的内容。遍历就是把游戏玩一遍,哈哈
leetcode 206:
逆转链表,一方面需要把方向改变,另一方面需要保存尚未逆转的链表部分的‘头结点’;
如此就需要3个节点:假设...->a -> b-> c->...
其中a,b是执行逆转任务:b.next = a; c是正常顺序的存档‘c->... ’
更新就是把a,b,c按照原本顺序往前走:
a= b;b = c; c = c.next, 重复上述操作
leetcode 24:
其实并不需要严格按照随想录上说的顺序进行修改:
面对笔试一个比较有效的办法是:‘存档’所有的节点。本题目我存档4个节点:称之为 ABCD,只要存档了,操作的顺序并不重要。重要的是你需要想到为了两两互换,单次的操作需要存档4个节点(而不是3或者2):因为两两互换后还需要链接互换前的前后节点,所以2+2 =4。
感觉这个思路虽然写出来的比较长,但是好读懂,好检查,且稳定性高,不再需要纠结先后顺序了:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dumb_head = ListNode(next = head)
A = dumb_head
while A.next and A.next.next:
B = A.next
C = B.next
D = C.next
B.next = D
C.next = B
A.next = C
A = B
return dumb_head.next