LenleDaytoy

剑指offer-35复杂链表的复制

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

1.三步法

第一步:在复杂链表的原始节点N后面创建对应节点N'

第二步:设置复制节点的random

第三步:把链表拆成两个链表

 1 class Solution:
 2     # 返回 RandomListNode
 3     def Clone(self, pHead):
 4         # write code here
 5         if not pHead:
 6             return pHead
 7         #1.复制对应节点
 8         pnode=pHead
 9         while pnode:
10             head2 = RandomListNode(pnode.label)
11             head2.next=pnode.next
12             pnode.next=head2
13             pnode=head2.next
14         pnode2=pHead
15         #2.设置节点的random值,下面两种写法都可
16         
17         # while pnode2 and pnode2.next:
18         #     temp=pnode2.random
19         #     if temp:
20         #         pnode2.next.random=temp.next
21         #     pnode2=pnode2.next.next
22         #写法二:
23         while pnode2:
24             temp=pnode2.next
25             if pnode2.random:
26                 temp.random=pnode2.random.next
27             pnode2=temp.next
28         #3.拆分链表
29         pnode4=pHead
30         copyhead=pHead.next
31         pnode3=copyhead
32         while pnode3 :
33             pnode4.next=pnode3.next
34             pnode4=pnode4.next
35             if pnode4:
36                 pnode3.next=pnode4.next
37             else:
38                 pnode3.next=None
39             pnode3=pnode3.next
40 
41         return  copyhead

小结:1.后面用到该节点的next时,一定要先判断节点是否为空

2.一个链表拆为两个节点是,注意两个链表后面都要置空。

posted on 2020-04-22 15:31  LenleDaytoy  阅读(105)  评论(0编辑  收藏  举报

导航