Copy List with Random Pointer
https://leetcode.com/problems/copy-list-with-random-pointer/
Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
题目:已知链表,它有额外的随机指针信息,随机指针可指向任意一个结点或null,复制这个链表。
分三步:1.在每个结点后复制该结点 2.复制随机指针 3.将新旧链表分开,得到copy链表
参考 http://www.cnblogs.com/zuoyuan/p/3745126.html 写得很好,很明确。
注:之后考虑“21行”为什么是 if tmp.random,题目已知这个随机指针可以为任结点或null,这岂不是把null这个情况没有考虑。
其实是题意理解有误:每个结点保存了一个值,这个值(信息)是指向其他结点或null的指针,
tmp.random就是个值,它不能空,可以保存指向null的信息,此间不矛盾。
1 # Definition for singly-linked list with a random pointer. 2 # class RandomListNode: 3 # def __init__(self, x): 4 # self.label = x 5 # self.next = None 6 # self.random = None 7 8 class Solution: 9 # @param head, a RandomListNode 10 # @return a RandomListNode 11 def copyRandomList(self, head): 12 if head==None:return None 13 tmp=head 14 while tmp: #在原有链表的各节点后面复制一个相同的节点并连接 15 newNode=RandomListNode(tmp.label) #用newNode表示,方便后面的传递 16 newNode.next=tmp.next 17 tmp.next=newNode 18 tmp=tmp.next.next 19 tmp=head #把tmp指针重新放回head处,就像i=0,再次赋初值一样 20 while tmp: #遗漏了此项 21 if tmp.random: #原有链表其结点的next(即为copy结点)它的随机指针怎么copy呢? 22 tmp.next.random=tmp.random.next #即为原有结点的随机指向结的next(即它的copy结点),完全相同指向它,实现随机指针的copy 23 tmp=tmp.next.next 24 newhead=head.next 25 p1=head 26 p2=newhead 27 while p2.next: #将原有链表和copy链表分离开 28 p1.next=p2.next 29 p1=p1.next 30 p2.next=p1.next #粗心略去了p2.next的next 31 p2=p2.next 32 p1.next=None #将结尾令为None,保证原链表的正确性(此前分离的p1.next还有一个copy项,用None删去) 33 p2.next=None 34 return newhead #newhead即为通过指针p2建立连接的copy链表