劍指Offer 複雜鍊錶的複製

2021-10-04 02:27:49 字數 1042 閱讀 9213

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

乙個單向鍊錶的複製很簡單,但是這道難點在於,我們多了乙個random隨機結點,最重要的是,我們如何找到這個複製後的隨機結點。

有兩種方法可以找到隨機結點,一種就是遍歷原鍊錶,找到每個隨機結點的位置,再在新的鍊錶中指向對應位置的結點。

但是遍歷鍊錶的方法,執行起來時間複雜度過高,為o(n2),所以今天只解釋另乙個方法,執行起來時間複雜度為o(n)

這個方法主要分為三步:拼接、random賦值、拆分

假設新建結點,因為我們要實現複製鍊錶。假設頭結點為n、第二個結點為m、複製的結點n`、複製的第二個結點為m`

則我們把新new出來的結點,鏈結到源鍊錶上,使n->n`->m->m`

此時問題變簡單了,不管n->random指向哪個結點,只要這個結點不為空,我們的n`->random一定是n->random->next

最後,把原鍊錶和複製的鍊錶拆分掉,返回我們複製後的鍊錶的頭結點

/*

struct randomlistnode

};*/

class solution

ptempheadnode = phead;

//其實我們不用加ptempheadnode->next是否為空的判斷,因為鍊錶經過我們的複製後是一對一對的,但是我們為了規範

while(ptempheadnode && ptempheadnode->next)

pclonehead = phead->next;

ptempheadnode = phead;

ptempnode = phead;

while(ptempheadnode && ptempheadnode->next)

return pclonehead;

}};

劍指offer複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...

劍指offer 複雜鍊錶複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...

劍指offer 複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...