我需要一個方法,它將鏈表作爲參數,如果它是循環的或不循環,則返回true或false。例如:圓形鏈表表示節點指向任何前一個節點。 我忘了告訴一些約束,我不能使用任何數據結構或動物內存分配。 我只能用局部變量和alogrithm可以在n個步驟,有人跟我說要做檢查鏈表的循環性
Q
檢查鏈表的循環性
3
A
回答
10
我相信你正在尋找Floyd's Cycle-Finding Algorithm。有一個比我能通過here更好的解釋。
在C和Scheme中還有幾個實現,其文檔大小爲here。
1
標準哈希計數適用(我現在想用兩個指針?):
function has_loop(list): foreach node in list: address = address_of(node.next); element = hashtable.get(address); if (element == NULL): hashtable.put(address) else: return true return false
編輯:根據已接受的答案的第二個鏈接,這可行但效率低下,這意味着有很多更有效的解決方案。
0
這是微不足道的。
previousnodes ← set()
previousnodes.add(firstnode)
currentnode ← firstnode.next
while (currentnode in previousnodes) || (currentnode != null):
previousnodes.add(currentnode)
currentnode ← currentnode.next
when (currentnode = 0) return false
return true
0
我自己遇到了這個問題的一個優雅的解決方案,並忍不住在這裏發佈(儘管我猜原版海報可能現在已經畢業了)。從開始節點開始,開始反轉列表。如果列表不是循環的,則該過程將以Null結束,如果列表確實是循環的,則該過程將在起始節點處結束。所以它就是一個具有恆定額外空間的線性時間算法。只需再次顛倒列表以恢復原始列表。
相關問題
- 1. 檢測鏈接列表中的循環
- 2. 檢測鏈表中的循環
- 3. 檢測鏈接列表中的循環。
- 4. 跟蹤檢測鏈表中的循環
- 5. 檢查循環
- 6. 鏈接列表循環檢測算法
- 7. 循環鏈表C
- 8. javascript循環鏈表
- 9. 檢查for循環
- 10. 檢查foreach循環中列表的相等性 - C#
- 11. 什麼時候需要檢查鏈接列表循環?
- 12. 如何檢查鏈表是否在Java中有循環?
- 13. 循環鏈表 - 無限循環
- 14. 循環隊列和循環鏈表
- 15. 將線性鏈表轉換爲循環鏈表
- 16. python中的循環鏈表
- 17. Python中的循環鏈表
- 18. 的Java:NPE在循環鏈表:(
- 19. Swift中的循環鏈表
- 20. 鏈接列表的一致性檢查
- 21. 理解雙向鏈表循環鏈表
- 22. 雙向鏈表循環鏈表
- 23. 單鏈表到循環鏈表
- 24. 循環鏈接列表
- 25. 鏈接列表循環
- 26. 同步循環鏈表
- 27. PHP循環鏈表實現
- 28. while循環鏈接列表
- 29. 錯誤在循環鏈表
- 30. 鏈表不正確循環
嗯,如果一個節點指向的前一個節點不是列表中的第一個節點,這將不起作用。 – 2008-12-30 10:47:53
是的,它並不像我想的那樣微不足道。但並非如此。 :) – Cheery 2008-12-30 10:49:56
檢查我更新的問題 – 2008-12-30 10:56:52