劍指Offer 複雜鍊錶的複製

2021-10-04 03:51:23 字數 2070 閱讀 8172

請實現乙個函式可以複製乙個複雜鍊錶。

在複雜鍊錶中,每個結點除了有乙個指標指向下乙個結點外,還有乙個額外的指標指向鍊錶中的任意結點或者null。

注意

雙重for迴圈的主要目的是查詢random節點的位置

分為兩步實現:

根據next指標新建鍊錶

雙重for迴圈,每次查詢到乙個random節點,就重新遍歷查詢其位置

時空分析

時間複雜度:時間複雜度o(n^2)

c++ **

/**

* definition for singly-linked list with a random pointer.

* struct listnode

* };

*/class

solution

// 第二步,雙重for迴圈,每次查詢到乙個random節點,就重新遍歷查詢其位置

for(

auto curnode = newlist-

>next, node = head; curnode && node;

) curnode-

>random = r_curnode;

} curnode = curnode-

>next;

node = node-

>next;

}return newlist-

>next;}}

;

分兩步來實現:

建立原鍊錶和目標鍊錶的對應關係,儲存到hash表中

遍歷原鍊錶,檢視random節點,根據hash表中儲存的對應關係,建立目標鍊錶的random節點關係

時空分析

時間複雜度:時間複雜符o(n)

空間複雜符:需要申請額外空間存放雜湊表對映o(n)

c++ **

/**

* definition for singly-linked list with a random pointer.

* struct listnode

* };

*/class

solution);

nextnode = nextnode-

>next;

}// 第二步,遍歷原鍊錶,檢視random節點,根據hash表中儲存的對應關係,

// 建立目標鍊錶的random節點關係

for(

auto node = head; node; node = node-

>next)

}return newlist-

>next;}}

;

主要思路是通過複製鍊錶的方式,來解決random節點的查詢問題。大體可以分為三步:

鍊錶所有節點中間都插入乙個複製節點,作為並行鍊錶

遍歷新鍊錶,遇到random節點後對應改變並行鍊錶中的節點

提取出並行鍊錶

時空分析

時間複雜度:時間複雜度o(n)

c++ **

/**

* definition for singly-linked list with a random pointer.

* struct listnode

* };

*/class

solution

for(

auto p = head; p; p = p-

>next-

>next)

auto dummy =

newlistnode(-

1);auto cur = dummy;

for(

auto p = head; p; p = p-

>next)

return dummy-

>next;}}

;

劍指offer複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...

劍指offer 複雜鍊錶複製

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

劍指offer 複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...