請實現乙個函式可以複製乙個複雜鍊錶。
在複雜鍊錶中,每個結點除了有乙個指標指向下乙個結點外,還有乙個額外的指標指向鍊錶中的任意結點或者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...