題目:複製乙個複雜鍊錶,所謂複雜鍊錶指的是每個節點含有兩個指標,乙個指向單鏈表的下乙個結點,乙個指向單鏈表中的任意某個結點,或者該指標為空。
為了方便起見,我們將待複製的鍊錶稱為原型鍊錶,將複製後的新鍊錶稱為複製鍊錶,將指向下乙個結點的指標定義為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,...