劍指offer 複雜鍊錶的複製

2021-09-27 17:57:25 字數 1864 閱讀 1613

這題稍稍費了點勁,注意理解對題意,並在最開始就要考慮特殊情況

最該注意的地方是:複製鍊錶,意思是新建乙個鍊錶類,再把各個元素連線起來,而不是簡單的指向原鍊錶的元素(聽著很蠢,但很容易犯這種錯)

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