数据结构:链表

今日做题有感,链表其实就像玩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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值