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链表

 

posted @ 2015-06-29 21:17  小榛子  阅读(103)  评论(0编辑  收藏  举报