題目:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
分析:這個題目說白了也就是實現這個類的拷貝建構函式,具體的有三種方法提供:
1、直觀的解法,把複製過程分成兩步:第一步是複製原始鍊錶上的每個節點,並且用next連線起來;第二步,設定每個節點的random指標。對於第一步遍歷一遍即可解決,花費o(n)的時間,但是對於第二步來說,每個指標的random指標都有可能指向當前節點的前面,由於為單向鍊錶,所以我們不得不重頭遍歷來確定random,因此需要花費o(n^2)的時間,所以總的時間效率為o(n^2)。具體的實現如下:
struct randomlistnode
};/*第一種方法,直觀的解法,首先賦值每個節點,然後連線next,最後連線random,總的花費o(n^2)*/
randomlistnode* clonenodes(randomlistnode*phead)
//第二步確定random指標
pnode = phead;
pclone_node = pclone_head;
while (pnode)
pclone_node->random = pclone_node1;
}pnode = pnode->next;
pclone_node = pclone_node->next;
}return pclone_head;
}
2、這一種方法還是分為兩步,第一步任然是複製原始鍊錶上的每個節點,但是在複製的同時我們把配對關係放在乙個雜湊表中< n,n』 >。第二步,確定random,此時我們有了雜湊表,即可以花費o(1)的時間就可以確定random,即總的時間為o(n)。相當於用空間換取了時間,具體的實現如下:
struct randomlistnode
};//第二種方法使用乙個雜湊表儲存對應的關係,這樣在找random節點時,只需要o(1)時間,相當於用空間換時間,總體的時間複雜度為o(n)
randomlistnode* clonenodes(randomlistnode*phead)
//在map中查詢對應的random
pnode = phead;
pclone_node = pclone_head;
while (pnode)
return pclone_head;
}
3、這一種方法比較巧妙,可以不用輔助空間,但是時間效率任然是o(n),具體分為三步:第一步,複製每個節點,但是此時把複製的節點連線在被複製的節點之後;第二步,確定random節點,由於在第一步,已經把每個複製的節點連線在原節點之後,所以此時複製節點的random就為,原節點的random的下乙個,只需要花費o(1)的時間就可以確定random;第三步,把鍊錶按奇偶拆分成兩個鍊錶,就可以得到,複製的鍊錶。具體的實現如下:
struct randomlistnode
};/*第三種方法:複製每個節點,並且將其連線在被複製的節點之後,這樣複製節點的random就為被複製節點random之後的那個節點,不需要額外的空間即可以達到o(n)*/
randomlistnode* clonenodes(randomlistnode*phead)
//複製每個節點並且把它連在原節點之後
void clone(randomlistnode* phead)
}//連線複製節點的random,即為被複製節點的random的下乙個
void randomclone(randomlistnode* phead)
pnode = pnode->next->next;
}}//按奇偶分開
randomlistnode* reconnectnode(randomlistnode*phead)
while (pnode)
return pclone_head;
}
鍊錶 複雜鍊錶的複製
問題描述 請實現函式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指標的節點,之後...