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