题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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.一个链表拆为两个节点是,注意两个链表后面都要置空。