其实这道题难度不是很大
在自己琢磨之后
方法1:
解题思路:借用双指针,创建一个临时指针作为中转。
class Solution:def reverseList(self, head: ListNode) -> ListNode:if not head:return NonepTemp = headcur = Nonewhile pTemp:temp = ListNode(head.val)temp.next = curcur = temppTemp = pTemp.nextreturn cur
方法2:
极简化思维(新手不推荐)
class Solution:def reverseList(self, head: ListNode) -> ListNode:last = Nonewhile head:head.next , last , head = last , head, head.nextreturn last
方法3:
就是本文的重点双指针赋值的新理解的写法。
class Solution:def reverseList(self, head: ListNode) -> ListNode: if not head :return Nonecur = headtmp= Nonewhile cur: cur, tmp, tmp.next = cur.next, cur, tmp
# cur.next, tmp , cur = tmp, cur, cur.next #根据方法2改编return tmp
对于
nums[i], nums[j] = nums[j], nums[i]
实现两个数交换。没有先后顺序。
但是
cur, tmp, tmp.next = cur.next, cur, tmp
却可以完成链表反转,其赋值语句是存在先后顺序的,但其代表着的是内存中数值的变化,
比如用例[1,2,3,4,5]第一次while循环中,cur = head,经过
cur = cur.next
此时cur指的是cur ->1 的位置。而 tmp 此时为None,经过
tmp = cur
在内存中 tmp = 1 ,再经过
tmp.next = tmp
即把1->None
即完成了第一次循环。
第二次循环同理:cur = 1,经过
cur = cur.next
cur 指向 2 ,而 tmp 此时为 1,经过
tmp = cur
在内存中 tmp = 2 ,再经过
tmp.next = tmp
即把2 -> 1