輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
解題思路:
1、複製每個節點,如:複製節點a得到a1,將a1插入節點a後面
2、遍歷鍊錶,a1->random = a->random->next;
3、將鍊錶拆分成原鍊錶和複製後的鍊錶
注意:在拆分的時候必須同時拆分,不能想著先拆分原始鍊錶再拆分複製鍊錶,必須同時拆分,因為如果打算先拆分乙個鍊錶拆分完後鍊錶已經不再包含另乙個鍊錶的節點了(是乙個思維的小誤區,一開始沒反應過來)。
答案:
自己的**寫的太醜了,粘了的別人的**。
# -*- coding:utf-8 -*-
# class randomlistnode:
# def __init__(self, x):
# self.label = x
# self.next = none
# self.random = none
class
solution:
# 返回 randomlistnode
defclone(self, phead):
ifnot
phead:
return
none
dummy = phead
# first step, n' to n next
while
dummy:
dummynext = dummy.next
copynode = randomlistnode(dummy.label)
copynode.next = dummynext
dummy.next = copynode
dummy = dummynext
dummy = phead
# second step, random' to random'
while
dummy:
dummyrandom = dummy.random
copynode = dummy.next
ifdummyrandom:
#這裡是因為隨機節點可能為空,一開始沒有考慮到。
copynode.random = dummyrandom.next
dummy = copynode.next
# third step, split linked list
dummy = phead
copyhead = phead.next
while
dummy:
copynode = dummy.next
dummynext = copynode.next
dummy.next = dummynext
ifdummynext:
copynode.next = dummynext.next
else:
copynode.next = none
dummy = dummynext
return copyhead
劍指offer複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...
劍指offer 複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...
複雜鍊錶的複製(劍指offer)
題目 有乙個複雜鍊錶,其結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任一結點或者null。請完成函式complexnode clone complexnode phead 以複製乙個複雜鍊錶。struct complexnode void cloneno...