Q25複雜鍊錶的複製

2021-10-03 00:19:16 字數 1748 閱讀 8518

題目描述

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

在網上看到有多種思路 這裡總結一下

解題思路一:

1.遍歷鍊錶 複製每個節點 將複製的節點插入原來的節點後面 如a->a1->b->b1

2.遍歷鍊錶 將老節點的特殊指標複製給新的節點

3.拆分鍊錶 將老鍊錶和新鍊錶區分開

思路二:

用雜湊表建立新舊鍊錶之間節點的對應關係

迭代舊鍊錶 建立新鍊錶節點之間的關係

補充幾個知識點:

id()函式用於獲取物件的記憶體位址

字典是另一種可變容器模型,且可儲存任意型別物件,字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:

d =

# -*- coding:utf-8 -*-

# class randomlistnode:

# def __init__(self, x):

# self.label = x

# self.next = none

# self.random = none

class

solution

:# 返回 randomlistnode

defclone

(self, phead)

:# write code here

head = phead #用於迴圈舊鍊錶的指標

p_head =

none

#用於指向表頭

new_head =

none

#新鍊錶的指標

old_new_list =

random_list =

while head:

node = randomlistnode(head.label)

# 這裡不能為head.label 因為int物件是沒有random node是建立指標

node.random = head.random

old_new_list[

id(head)]=

id(node)

#鍵為老鍊錶的位址 值為新鍊錶的位址

random_list[

id(node)

]= node #輸入新鍊錶的位址 輸出鍊錶的值

head = head.

next

if new_head:

new_head.

next

= node

new_head = new_head.

next

else

: new_head = node

p_head = node

new_head = p_head

while new_head:

if new_head.random !=

none

: new_head.random = random_list[old_new_list[

id(new_head.random)]]

new_head = new_head.

next

return p_head

25 複雜鍊錶的複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 時間限制 1秒 空間限制 32768k 感覺這題目好無聊,自己想到的方法大概是乙...

25 複雜鍊錶的複製

題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 struct randomlistnode class solution pnode...

25 複雜鍊錶的複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 struct randomlistnode class solution 解題思...