其实这道题难度不是很大
在自己琢磨之后
方法1:
解题思路:借用双指针,创建一个临时指针作为中转。
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head:
return None
pTemp = head
cur = None
while pTemp:
temp = ListNode(head.val)
temp.next = cur
cur = temp
pTemp = pTemp.next
return cur
方法2:
极简化思维(新手不推荐)
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
last = None
while head:
head.next , last , head = last , head, head.next
return last
方法3:
就是本文的重点双指针赋值的新理解的写法。
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head :
return None
cur = head
tmp= None
while 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