-
Notifications
You must be signed in to change notification settings - Fork 185
/
Copy path15_LinkListClone.py
50 lines (44 loc) · 1.68 KB
/
15_LinkListClone.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 复杂链表的复制
# 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),
# 请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
# 链表结构
class RandomListNode:
def __init__(self, x):
self.label = x
self.next = None
self.random = None
class Solution:
# 返回合并后列表
def Clone(self, pHead):
if pHead == None:
return None
pTmp = pHead
# 复制一个一样的node,并且添加到之前的链表的每一个node后面
while pTmp:
# 创建一个和原来一样的node
node = RandomListNode(pTmp.laebl)
node.next = pTmp.next
# 将原来的指向刚刚创建的节点
pTmp.next = node
# 同时移动被复制的节点
pTmp = node.next
# 实现新建node的random的指向
pTmp = pHead
while pHead:
# 将复制节点的random,指向 它Random的next
if pTmp.random:
pHead.next.random = pTmp.random.next
pTmp = pTmp.next.next
# 断开原来的node 和 新 node 之间的连接
pTmp = pHead
newHead = pHead.next
pNewTmp = pHead.next
while pTmp:
pTmp.next = pTmp.next.next
if pNewTmp.next:
pNewTmp.next = pNewTmp.next.next
pTmp = pTmp.next
pNewTmp = pNewTmp.next
return newHead
if __name__ == '__main__':
print()