新聞中心
這篇文章主要為大家展示了“LeetCode如何實現(xiàn)復(fù)雜鏈表的復(fù)制”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“LeetCode如何實現(xiàn)復(fù)雜鏈表的復(fù)制”這篇文章吧。
澗西網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,澗西網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為澗西千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的澗西做網(wǎng)站的公司定做!
題目描述
請實現(xiàn) copyRandomList 函數(shù),復(fù)制一個復(fù)雜鏈表。在復(fù)雜鏈表中,每個節(jié)點除了有一個 next 指針指向下一個節(jié)點,還有一個 random 指針指向鏈表中的任意節(jié)點或者 null。
-10000 <= Node.val <= 10000 Node.random 為空(null)或指向鏈表中的節(jié)點。 節(jié)點數(shù)目不超過 1000 。
題目樣例
示例
輸入

head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出
[[7,null],[13,0],[11,4],[10,2],[1,0]]
題目思考
如何處理 random 指針?
解決方案
思路
如果只有 next 指針的話很簡單, 我們只需要對每個節(jié)點新建一個相同值的節(jié)點, 并保持指向關(guān)系, 逐個遍歷過去即可 現(xiàn)在多了個 random 指針, 想要定位新的指向的節(jié)點, 一個比較自然的想法就是額外維護(hù)一個老節(jié)點到新節(jié)點的映射關(guān)系, 可以用字典來實現(xiàn) 第一遍遍歷, 就只關(guān)注 next 部分, 并建立好映射關(guān)系 第二遍遍歷, 考慮 random 部分, 找到對應(yīng)的新鏈表的節(jié)點, 然后當(dāng)前節(jié)點的 random 指針指向它即可
復(fù)雜度
時間復(fù)雜度 O(N)
每個節(jié)點只需要遍歷兩次 空間復(fù)雜度 O(N)
額外需要一個字典
代碼
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
maps = {}
# 第一遍遍歷, 建立新的鏈表, 以及老節(jié)點到新節(jié)點的映射關(guān)系
copyHead = Node(head.val)
origin, copy = head, copyHead
maps[origin] = copy
while origin.next:
# 新建下一個節(jié)點, 并建立next關(guān)系
copy.next = Node(origin.next.val)
origin = origin.next
copy = copy.next
maps[origin] = copy
# 第二遍遍歷, 處理random指針部分
origin, copy = head, copyHead
while origin:
if origin.random:
# 如果老節(jié)點random指針指向非空的話, 就將當(dāng)前新節(jié)點也指向隨機節(jié)點對應(yīng)的新節(jié)點
copy.random = maps[origin.random]
origin = origin.next
copy = copy.next
return copyHead
以上是“LeetCode如何實現(xiàn)復(fù)雜鏈表的復(fù)制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站名稱:LeetCode如何實現(xiàn)復(fù)雜鏈表的復(fù)制
文章出自:http://fisionsoft.com.cn/article/gpgjss.html