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