剑指offer24--反转链表(关于双指针赋值的新理解)

 

其实这道题难度不是很大

在自己琢磨之后

方法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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值