美文网首页
2019-07-18 剑指复杂链表的复制

2019-07-18 剑指复杂链表的复制

作者: mztkenan | 来源:发表于2019-07-18 09:47 被阅读0次

40min 测试现行 pycharm 本地跑通之后 线上一次通过

1.not PHead 是空的搞错了
2.指针没有往下移动,循环没有跳出
3.key指为None的时候没有键值

# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        dummy=RandomListNode(None)
        cur=dummy
        dic={}
        original_p=pHead
        while original_p:
            tmp=RandomListNode(original_p.label)
            cur.next=tmp
            cur=cur.next
            dic[original_p]=tmp
            original_p=original_p.next
        cur=dummy.next
        while pHead:
            if pHead.random:cur.random=dic[pHead.random]  # 如果random是None会没有这个键
            pHead=pHead.next
            cur=cur.next
        return dummy.next

第二种方法是复制到当前节点的下一个节点,也是hash的思想,不用再去遍历寻找这个节点
1.经常忘记指针循环
2.指针操作很容易错。最后容易忘了把指针指向None
3.bool值取反 not

本地测试和Solution比较没有差别,但是平台报错 空??根本无法检查吗,报空 原来是PHead不能改变 50min
重新检查6min发现问题

class Solution2():
    def Clone(self,pHead):
        # 复制节点,并放在每个节点的next
        cur=pHead
        while cur:
            new=RandomListNode(cur.label)
            second=cur.next
            cur.next=new
            new.next=second
            cur=second
        # 复制random
        cur=pHead
        while cur:
            # print(cur.label)
            if cur.random:cur.next.random=cur.random.next # 卧槽调试二十分钟是这里错了,cur.next.random,还是靠中间结果的打印,缩小范围
            cur=cur.next.next # 时隔二十天重新检查了一遍发现是这里出了问题
        # 剪下新复制的链表
        dummy=RandomListNode(None)
        dummy2=RandomListNode(None)
        cur=pHead
        even=False
        new_cur=dummy
        old_cur=dummy2
        while cur:
            # print(cur.label)
            if even:
                new_cur.next=cur
                new_cur=new_cur.next
            else:
                old_cur.next=cur
                old_cur=old_cur.next
            even=not even  # 为何最后结果为空,其他看了一遍应该都对的,所以应该是~even有错
            cur=cur.next
        old_cur.next=None # 老链表里的最后一个还与新链表里藕断丝连
        return dummy.next

相关文章

网友评论

      本文标题:2019-07-18 剑指复杂链表的复制

      本文链接:https://www.haomeiwen.com/subject/jbrklctx.html