輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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...