演算法題 複製複雜鍊錶之空間換時間法

2021-06-23 02:16:28 字數 1548 閱讀 5050

題目:複製乙個複雜鍊錶,所謂複雜鍊錶指的是每個節點含有兩個指標,乙個指向單鏈表的下乙個結點,乙個指向單鏈表中的任意某個結點,或者該指標為空。

為了方便起見,我們將待複製的鍊錶稱為原型鍊錶,將複製後的新鍊錶稱為複製鍊錶,將指向下乙個結點的指標定義為next指標,指向其他位置的指標定義為any指標。《劍指offer》上給出了三種解決方法:(1)常規法;(2)空間換時間法;(3)緊隨複製法。書上並給出了第三種方法的實現**。這裡我根據書上的提示,給出第二種方法的**

在給出**之前我們先理解下實現的演算法思想。我們知道,如果沒有any指標,我們可以很容易得完成複製任務。但是有了any指標,我們就需要考慮如何複製每乙個結點的any指標。演算法2給出的思想是在構建乙個單鏈表的過程中,設定複製結點與原型結點的一一對映關係,這樣在建立完新的單鏈表之後,我們可以通過原型結點的any指標指向的結點位置,通過查詢對映表來獲得複製結點的any指標的指向,顯然我們可以用hash表或者其他具有對映思想的資料結構,如紅黑樹。在c++stl中,我們可以採用map容器來實現這一對映。

為了更清晰地理解該複製過程,我們給出如下複雜鍊錶:

該複製鍊錶的建立**如下:

#include#includeusing namespace std;

struct node

};/*建立乙個鍊錶,1->2->3->4->5->6->7*/

node* createlist()//建立乙個單鏈表

void freelist(node *head)//將鍊錶空間釋放

else }

void visitlist(node *head)//遍歷鍊錶中的元素,用遞迴的方法遍歷

else

if(p->next)

p=p->next;

} cout<

複製複雜鍊錶的實現**如下:

node *clone(node *head)//用hash法儲存any指標

else

m[p]=p1;//建立原結點與新結點直接的對映關係

p=p->next;

} p=head;

p1=head1;

while(p)//依次複製每個結點的any指標

return head1;

}

測試**如下:

int main()

測試結果如下:

參考資料------------《劍指offer》

演算法題 複雜鍊錶的複製

複雜鍊錶的複製 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m pnext指標指向下乙個節點,還有乙個m psibling指標指向鍊錶中的任意節點或者nullptr。節點的c 定義如下 後面 均為...

演算法題 複雜鍊錶的複製

請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶,在複雜鍊錶中,每個結點除了有乙個m ppext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者 null。結點的 c 定義如下 struct complexl...

leetcode演算法題 複雜鍊錶的複製

題目 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。示例 1 輸入 head 7,null 13,0 11,4 10,2 1,0 輸出 7,null 13,...