JZ25 复杂链表的复制
哈希表
my version
错误记录
- 复制首节点时,不能np_指针不能往后移,否则会为空
class RandomListNode:
def __init__(self, x):
self.label = x
self.next = None
self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
if not pHead:
return
nL = None
op = pHead
np_ = nL
map_old_new = {} # {old_p:new_p}
while op:
node = RandomListNode(op.label)
if not nL:
nL = node
np_ = nL
else:
np_.next = node
np_ = np_.next # 不能写在后面
map_old_new[op] = node
op = op.next
op = pHead
while op:
if op.random:
map_old_new[op].random = map_old_new[op.random]
op = op.next
return nL
book version
- 复制原节点连接在原节点之后
- 复制随机连接
- 断开为两个链表
错误记录
- 指针指向链表时需要注意是否指向的为引用
egpnext = p.next p.next = p.next.next
此时pnext的值会指向p.next.next而没有保留p.next
class RandomListNode:
def __init__(self, x):
self.label = x
self.next = None
self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if not pHead:
return
p = pHead
while p:
copy = RandomListNode(p.label)
copy.next = p.next
p.next = copy
p = p.next.next
p = pHead
while p:
if p.random:
p.next.random = p.random.next
p = p.next.next
p = pHead
copy_list = pHead.next
cp = pHead.next
while p:
p.next = p.next.next
p = p.next
if cp.next:
cp.next = cp.next.next
cp = cp.next
return copy_list