鍊錶問題 複雜鍊錶的複製

2021-08-21 01:35:58 字數 2004 閱讀 4298

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