這題稍稍費了點勁,注意理解對題意,並在最開始就要考慮特殊情況
最該注意的地方是:複製鍊錶,意思是新建乙個鍊錶類,再把各個元素連線起來,而不是簡單的指向原鍊錶的元素(聽著很蠢,但很容易犯這種錯)
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
這是我自己的想法,稍微有些複雜
先複製鍊錶主幹,並生成新鍊錶與原鍊錶的對映關係,在根據原鍊錶的random指標與對映關係,將random指標複製到新煉表中
# -*- 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
ifnot phead:
return
none
# 這兩個list是用來生成對映關係的
# 對映的方法是兩個list相同index的元素,就是相互對應的鍊錶元素
map_list_ori =
map_list_new =
new_head = randomlistnode(phead.label)
ifnot phead.
next
:return new_head
pointer = phead.
next
next_node = randomlistnode(pointer.label)
new_head.
next
= next_node
pointer = pointer.
next
# 這裡是先複製主幹
while pointer:
next_node_pointer = randomlistnode(pointer.label)
next_node.
next
= next_node_pointer
next_node = next_node_pointer
pointer = pointer.
next
if phead.random:
index = map_list_ori.index(phead.random)
new_head.random = map_list_new[index]
pointer = phead.
next
# 這裡複製random指標
# 應該不難理解為什麼先複製主幹,再複製random指標
while pointer:
if pointer.random:
pointer_index = map_list_ori.index(pointer)
random_index = map_list_ori.index(pointer.random)
map_list_new[pointer_index]
.random = map_list_ori[random_index]
pointer = pointer.
next
return new_head
還有一種使用更普遍的解法,日後更新 劍指offer複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...
劍指offer 複雜鍊錶複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...
劍指offer 複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...