首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在单链表中查找循环

在单链表中查找循环
EN

Stack Overflow用户
提问于 2012-04-23 14:05:09
回答 13查看 76.9K关注 0票数 66

如何检测单链表是否有循环?如果它有循环,那么如何找到循环的起始点,即循环开始的节点。

EN

Stack Overflow用户

发布于 2019-01-13 12:40:43

在大多数情况下,前面的所有答案都是正确的,但这里是逻辑的简化版本和可视化代码(适用于Python3.7)

正如其他人解释的那样,逻辑非常简单。我将创建Tortoise/slow和Hare/fast。如果我们以不同的速度移动两个指针,那么最终快将遇到慢!!您也可以将其视为一个tack循环字段中的两个runners。如果跑得快的人继续绕圈跑,它就会遇到/超过跑得慢的人。

因此,我们将在每次迭代中以1的速度移动乌龟/慢指针,同时不断递增或以2的速度移动Hare/fast指针。一旦它们相遇,我们就知道有一个循环。这也称为Floyd's cycle-finding algorithm

以下是执行此操作的Python代码(请注意,has_cycle方法是主要部分):

代码语言:javascript
复制
#!/usr/bin/env python3
class Node:
    def __init__(self, data = None):
        self.data = data
        self.next = None
    def strnode (self):
        print(self.data)


class LinkedList:
    def __init__(self):
        self.numnodes = 0
        self.head = None


    def insertLast(self, data):
        newnode = Node(data)
        newnode.next = None
        if self.head == None:
            self.head = newnode
            return

        lnode = self.head
        while lnode.next != None :
            lnode = lnode.next
        lnode.next = newnode # new node is now the last node
        self.numnodes += 1

    def has_cycle(self):    
        slow, fast = self.head ,self.head  
        while fast != None:       
            if fast.next != None:
                 fast = fast.next.next
            else:
                 return False
            slow = slow.next  
            if slow == fast:
                print("--slow",slow.data, "fast",fast.data) 
                return True    
        return False


linkedList = LinkedList()
linkedList.insertLast("1")
linkedList.insertLast("2")
linkedList.insertLast("3")


# Create a loop for testing 
linkedList.head.next.next.next = linkedList.head; 
#let's check and see !
print(linkedList.has_cycle())
票数 2
EN
查看全部 13 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10275587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档