劍指offer 複雜鍊錶複製

2021-08-17 08:25:15 字數 1602 閱讀 3195

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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...