問題描述
請實現函式complexlistnode* clone(complexlistnode* phead),複製乙個複雜鍊錶。
在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。
結點的定義如下
struct randomlistnode
};
分析問題
方法1:
看到這個問題最直觀的感受就是,把複製過程分為兩步
(1)複製原始鍊錶的每乙個節點,並用next指標域連線起來
(2)設定每個節點的random 域;
假設原始鍊錶中某個結點n的random 指標指向結點s,那麼就需要從頭到尾遍歷查詢結點s,如果從原始鍊錶的頭指標開始,經過m步之後達到結點s,那麼在複製鍊錶中的結點n』的random 指標指向的結點也是距離複製鍊錶s步的結點。通過這種辦法就可以為複製鍊錶上的每個結點設定random 指標。
時間複雜度:定位每個節點的random域都需要從鍊錶的頭節點開始經過o(n)步才能找到,因此這種方法的時間複雜度o(n^2)。
方法2:
方法1的浪費的時間在查詢每個節點random域,所以可以考慮把查詢方面優化,利用雜湊,空間換區時間,查詢效率o(1)。
複製原始鍊錶上的每個結點n建立n』,然後把這些建立出來的結點用pnext連線起來。同時把(n,n』)的配對資訊方法乙個雜湊表中;然後設定複製鍊錶中的每個結點的random指標,如果原始鍊錶中結點n的random指向結點s,那麼在複製鍊錶中,對應的n』應該指向s』。
時間複雜度:o(n)。
方法3
在不借助輔助空間的下實現o(n)的時間效率。
第一步:根據原始鍊錶的每個結點n建立對應的n』,然後將n『通過pnext接到n的後面;clonenodes函式實現
第二步:設定複製出來的結點的random。假設原始鍊錶上的n的random指向結點s,那麼其對應複製出來的n』是n->pnext指向的結點,同樣s』也是結點s->pnext指向的結點。setradom函式實現
第三步:把長鍊錶拆分成兩個鍊錶,把奇數字置的結點用pnext連線起來的就是原始鍊錶,把偶數字置的結點通過pnext連線起來的就是複製鍊錶。reconnectlist函式實現。
**實現
1、hash 實現(方法2)
struct complexlistnode;
};typedef
std::map
map;
complexlistnode* clonenodes(complexlistnode* phead,map &hashnode)
return pnode->pnext;
}void setsiblings(complexlistnode* phead,complexlistnode* pcopy,map &hashnode)
}complexlistnode* complexlistcopy(complexlistnode* phead)
2、方法3的實現
void clonenodes(randomlistnode* phead)
}//複製random指標域
void setradom(randomlistnode* phead)
pcur = pclonenode->next;
}}//拆分成兩個鍊錶:奇數字 ,偶數字
randomlistnode* reconnectlist(randomlistnode* phead)//頭結點不為空
while (pnode !=
null)
return pclonehead;
}randomlistnode* clone(randomlistnode* phead)
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...
複製複雜鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...
複雜鍊錶複製
題目要求 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 自己的想法 對於本題目,我一開始很悶,這不就是吧節點返回而已嗎?但是當我看到了題...