複雜鍊錶的複製

2021-07-03 01:30:56 字數 1326 閱讀 2904

題目:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),將此鍊錶進行複製。

複雜鍊錶的結構體定義如下:

struct randomlistnode 

};

對於正常鍊錶的複製,很簡單只要將鍊錶遍歷一遍重新生成一遍就好,那麼這個所謂的複雜鍊錶不過是多了乙個隨機指標(random),其實,我們如果使用暴力的方式,一點一點找也不是不可以的,可能時間複雜度會有點問題,那麼我們就來介紹一一種討巧的思路(這個思路是我看到一位大哥的部落格上寫的,由於當時沒收藏,所以就不給出鏈結,勿怪)

如果我們先不管隨機指標(random),那麼原鍊錶應該如圖:

那麼,有人會問下面那些差不多的單結點幹什麼的呢?其實,這就是討巧的地方,如果我們再遍歷原結點時,將每個結點插入相同的結點,當然,加入結點的隨機指標(random)先設定為null,結果如下:

這樣就形成了乙個新的鍊錶,可能有人會問,這麼做什麼目的呢?我們看一下,舉個例子,假設原鍊錶1結點的random指標指向原鍊錶3結點,那麼新鍊錶的1結點的random指標應該指向新的3結點,那麼,這個新3結點位置怎麼表示呢?很明顯,在長鍊表中就是,原來3結點的next

首先形成新的長鍊錶的**如下(只需要乙個while迴圈即可):

randomlistnode *p = phead;

//在每項後面插入一項

while(p)

接下來我們要做的是給每個新的結點的random賦值,**如下:

//將新增項的隨機指標寫入

p = phead;

while(p)

p = phead;

然後呢?只需要將乙個長鍊表進行拆分就可以了,拆成兩個鍊錶就行了,接下來給出整體**:

randomlistnode* clone(randomlistnode* phead)

//將新增項的隨機指標寫入

p = phead;

while(p)

p = phead;

//將乙個鍊錶拆分

if(p)

randomlistnode *temp=p->next;

while(p)

return clonehead;

}

鍊錶 複雜鍊錶的複製

問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...

複雜鍊錶複製

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

複製複雜鍊錶

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