劍指offer 25 複雜鍊錶的複製

2021-08-21 08:46:09 字數 2123 閱讀 6942

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

本題的最簡答的思路就是先實現結點與next指標的複製,然後利用遍歷整個鍊錶尋找每個結點的random指標指向的結點,然後依次在新鍊錶中實現複製,這樣的時間複雜度為o(n

2)

o(n^2)

o(n2

),這樣的演算法不夠高效。以下思路可以利用o(n

)o(n)

o(n)

的時間複雜度實現這種鍊錶的複製。思路如下:

首先鍊錶的每個結點一次進行賦值,並把複製後的結點插入到原節點之後,這一步不對random指標進行處理;

由於複製之後的結點都在原節點之後,那麼對應複製之後random指標指向的結點就是原結點random指標指向元素的下乙個結點。那麼只需遍歷整個複製後的鍊錶,完成複製結點的random指標的指向。

最後實現複製後結點的分拆即可;

#include

using

namespace std;

struct randomlistnode };

class

solution

this

->

clonenodes

(phead)

;// 實現鍊錶複製,複製後的結點放在原節點之後

this

->

connect_random_node

(phead)

;// 對複製後的結點的隨機指標進行賦值

randomlistnode* tmp = phead;

randomlistnode* clone_list =

get_clone_list

(phead)

;//完成複製後鍊錶的分拆

return clone_list;

}void

clonenodes

(randomlistnode* phead)

}void

connect_random_node

(randomlistnode* phead)

node = node_clone-

>next;}}

randomlistnode*

get_clone_list

(randomlistnode* phead)

}return result;}}

;randomlistnode*

find

(randomlistnode* head,

int k)

randomlistnode* tmp = head;

while

(tmp)

tmp = tmp-

>next;

}return tmp;

}int

main()

head = head-

>next;

tmp = head;

randomlistnode* tmp1 = head;

// 隨機指定random指標

for(

int i =

0; i < n ; i++

) tmp= tmp-

>next;

}// 列印原始鍊錶

tmp = head;

while

(tmp)

tmp = head;

while

(tmp)

else

tmp = tmp-

>next;

} cout

solution s;

randomlistnode* clone = s.

clone

(head)

;// 列印複製後的鍊錶

tmp = clone;

while

(tmp)

tmp = clone;

while

(tmp)

else

tmp = tmp-

>next;}}

return0;

}

劍指offer 25 複雜鍊錶的複製

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

劍指offer 25 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a1 ran...

劍指offer25 複雜鍊錶的複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 首先想到的肯定是遞迴來求解了 coding utf 8 class random...