簡體   English   中英

查找大小未知的循環鏈表的最后一個節點,最后一個節點指向鏈表的第一個節點以外的任何其他節點

[英]Find the last node of a circular linked list whose size is unknown and the last node points to any other node except first node of the linked list

如何查找圓形鏈表的最后一個節點,其大小我不知道,最后一個節點指向除鏈表的第一個節點以外的任何其他節點?

可用於此的一種算法是Floyd循環算法。

另外,請看這個問題。

根據定義,如果節點未指向循環鏈表的第一個節點,
它不是最后一個節點。

你能在這里詳細說明嗎?

一個奇怪的清單......為什么你需要這樣的東西? 但無論如何...

您可以簡單地遍歷所有節點,並在下一個節點成為您已訪問過的節點時立即停止。 然后,當前節點將是您的答案。

您需要一些方法來跟蹤已訪問的節點。 為每個節點添加布爾標志,或使用某種具有快速插入和查找的設置數據類型(例如哈希集)。

也許添加參數到列表的節點,告訴你你是否在結束? 我想,這不會有問題。

否則,您可以記住已經訪問過的節點。 當訪問了下一個節點時,您就在最后。

Floyd循環算法不會給出列表的最后一個元素。 它只會告訴你是否有一個循環。

最后一個的定義是,在從第一個開始的順序掃描中遍歷列表時,之前的所有元素和最后一個元素之前都沒有被看到(指針值)。 最后一個將是在此順序掃描中已經看到的第一個元素。

一個簡單的解決方案是標記訪問過的元素,以便輕松檢測已經看到的元素。 該標志可以是侵入性的,即通過改變元素中的位,或者通過使用散列表來存儲指針值。

由於我們需要能夠測試元素是否已被訪問過,所以我沒有看到另一種解決方案。

我可以詳細說明如何使用Floyd的算法來解決這個問題,但我不明白一步的解釋

  1. 有2個指針遍歷鏈表,指針1以每個迭代1個節點的速率運行,第二個指針以2個節點的速率運行
  2. 當指針相遇時,我們處於循環中,並且在指針1到達循環結束之前我們已經有一段距離了(我們知道指針1還沒到達然后結束,因為如果循環是距離d而指針2是兩倍於速度為1,指針1將在指針1執行一次之前循環兩次循環)
  3. 因為它們在指針1完全遍歷循環之前已經遇到過,我們知道會合點是從開始的d個節點和循環內的k個節點(pos = d + k)
  4. 如果我們將指針1設置到位置0並再次啟動兩個點(但是每次迭代的速率相同,則它們將在循環開始時相遇)。
  5. 由於我們知道循環的開始,找到結束是微不足道的

我不完全理解為什么第4步是真的,但我有一位朋友向我解釋解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM