鍊錶 複雜鍊錶的複製

2021-09-30 14:37:56 字數 2032 閱讀 8664

問題描述

請實現函式complexlistnode* clone(complexlistnode* phead),複製乙個複雜鍊錶。

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

結點的定義如下

struct randomlistnode 

};

分析問題

方法1:

看到這個問題最直觀的感受就是,把複製過程分為兩步

(1)複製原始鍊錶的每乙個節點,並用next指標域連線起來

(2)設定每個節點的random 域;

假設原始鍊錶中某個結點n的random 指標指向結點s,那麼就需要從頭到尾遍歷查詢結點s,如果從原始鍊錶的頭指標開始,經過m步之後達到結點s,那麼在複製鍊錶中的結點n』的random 指標指向的結點也是距離複製鍊錶s步的結點。通過這種辦法就可以為複製鍊錶上的每個結點設定random 指標。

時間複雜度:定位每個節點的random域都需要從鍊錶的頭節點開始經過o(n)步才能找到,因此這種方法的時間複雜度o(n^2)。

方法2:

方法1的浪費的時間在查詢每個節點random域,所以可以考慮把查詢方面優化,利用雜湊,空間換區時間,查詢效率o(1)。

複製原始鍊錶上的每個結點n建立n』,然後把這些建立出來的結點用pnext連線起來。同時把(n,n』)的配對資訊方法乙個雜湊表中;然後設定複製鍊錶中的每個結點的random指標,如果原始鍊錶中結點n的random指向結點s,那麼在複製鍊錶中,對應的n』應該指向s』。

時間複雜度:o(n)。

方法3

在不借助輔助空間的下實現o(n)的時間效率。

第一步:根據原始鍊錶的每個結點n建立對應的n』,然後將n『通過pnext接到n的後面;clonenodes函式實現

第二步:設定複製出來的結點的random。假設原始鍊錶上的n的random指向結點s,那麼其對應複製出來的n』是n->pnext指向的結點,同樣s』也是結點s->pnext指向的結點。setradom函式實現

第三步:把長鍊錶拆分成兩個鍊錶,把奇數字置的結點用pnext連線起來的就是原始鍊錶,把偶數字置的結點通過pnext連線起來的就是複製鍊錶。reconnectlist函式實現。

**實現

1、hash 實現(方法2)

struct complexlistnode;

};typedef

std::map

map;

complexlistnode* clonenodes(complexlistnode* phead,map &hashnode)

return pnode->pnext;

}void setsiblings(complexlistnode* phead,complexlistnode* pcopy,map &hashnode)

}complexlistnode* complexlistcopy(complexlistnode* phead)

2、方法3的實現

void clonenodes(randomlistnode* phead)

}//複製random指標域

void setradom(randomlistnode* phead)

pcur = pclonenode->next;

}}//拆分成兩個鍊錶:奇數字 ,偶數字

randomlistnode* reconnectlist(randomlistnode* phead)//頭結點不為空

while (pnode !=

null)

return pclonehead;

}randomlistnode* clone(randomlistnode* phead)

複雜鍊錶複製

複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...

複製複雜鍊錶

題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...

複雜鍊錶複製

題目要求 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 自己的想法 對於本題目,我一開始很悶,這不就是吧節點返回而已嗎?但是當我看到了題...