題目:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),將此鍊錶進行複製。
複雜鍊錶的結構體定義如下:
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指標的節點,之後...