我们如何找到链表中循环的起始节点?

15 浏览
0 Comments

我们如何找到链表中循环的起始节点?

根据弗洛伊德的循环检测算法,乌龟和兔子相遇的点解释了链表中循环的性质。

为了找到循环的起始节点,我们将乌龟指针初始化为链表的头部,并逐渐增加兔子和乌龟指针一次一个单位。它们相遇的点表示循环的起始节点。

请告诉我它如何适用于给定的情况。

链表的流程如下:

1->2->3->4->5->6->7->8->3

0
0 Comments

在给定的情况下,我们如何找到链表中循环的起始节点?

让我们来看看。

你将兔子和乌龟放在1的位置,并让它们跑步,兔子的速度是乌龟的两倍。

在第0步,它们都在1的位置。在第一步,乌龟移动到2的位置,兔子移动到3的位置,依此类推。

所以兔子和乌龟在7相遇了。

现在将乌龟放在开头,并让它们再次跑步,速度相同。

所以它们确实在循环的第一个元素相遇了。

这就是它在给定情况下的工作方式。

严格来说,从数学上讲,你是对的——假设我们使用某个映射函数连续地获取下一个元素,即前一个元素的某个递归函数。然而,在实践中给定一个链表,只有在假设该列表是循环连接的情况下,这才能起作用。

抱歉,我一点都不知道。1指向2,2指向3,3指向4,4指向5,5指向6,6指向7,7指向8,8又指向3。在你的眼前,这就是一个循环链表。还需要什么?

当i = 4时,对于这个例子,2i = 8,一切都很好。但是当i = 5时会发生什么?你是怎么确定i=10时的"兔子"元素是5的?如果你有一个基于前一个元素确定下一个元素值的函数,比如f(3) = 4,f(4) = 5,你所说的完全有道理。但是如果只给出了一个链表而没有给出一个映射函数,这就没有意义了。对于数学上的正确性,我应该在我的回答中说"链表"而不是"序列"。

让我再说一遍,这是一个循环链表。第8个元素指向第3个元素。它是在第2个元素之后看到的同一个第3个元素。只是它显示在不同的位置。这个链表中没有尾部。

你是对的,但如果你首先开始递增快指针,然后是慢指针,会发生什么情况呢?情况将会是1 1,3 2,5 3,7 4,3 5,5 5。

3 5然后5 5?为什么,有人得到了一套新的刹车?

好吧,我承认如果是这种情况,你是对的。我想我只是没有完全理解"链表"应该是什么意思——显然,它是一个包含循环的整个图形,而不仅仅是一个链表。

0
0 Comments

链表中的循环是一个常见的问题,我们需要找到循环的起始节点。为了解决这个问题,我们可以使用两个指针A和B。A每次向前移动一个节点,B每次向前移动两个节点。如果链表中存在循环,那么它们最终会相遇。

当它们相遇时,假设A已经移动了m个节点,那么B已经移动了2m个节点。根据题目中给出的条件,m = a + b,其中a是循环起始节点之前的距离,b是A在循环起始节点之后移动的距离。另外,2m = a + b + k * lengthOfLoop,其中k是B在循环中移动的圈数。

通过一些数学推导,我们可以得到a = k * lengthOfLoop - b。现在我们将B放回到链表的头部,并将其速度减为1。对于B来说,它距离循环起始节点还有a个节点的距离。对于A来说,它已经通过b距离循环起始节点,并且根据上述方程,它距离循环起始节点也是a个节点。

所以,在移动a个节点之后,A和B将再次相遇在循环起始节点处。

0
0 Comments

链表中的循环指的是链表中的一个节点指向链表中的一个先前节点,从而形成一个循环。这种情况可能会导致链表遍历时陷入无限循环。因此,当我们在链表中遇到循环时,需要找到循环的起始节点。

为了解决这个问题,可以使用Floyd's循环查找算法,也被称为龟兔赛跑算法。该算法使用两个指针,一个被称为乌龟指针(tortoise),一个被称为兔子指针(hare)。乌龟指针每次移动一个节点,兔子指针每次移动两个节点。

首先,我们需要初始化乌龟和兔子指针,使它们分别指向链表的起始节点。

然后,我们进入一个循环,直到乌龟和兔子指针相遇。在每次循环迭代中,乌龟指针移动一个节点,兔子指针移动两个节点。如果链表中存在循环,它们最终会相遇。

一旦乌龟和兔子指针相遇,我们可以将其中一个指针重置到链表的起始节点,并保持另一个指针在相遇点。然后,我们再次进入循环,但这次,乌龟和兔子指针都只移动一个节点。当它们再次相遇时,它们相遇的节点就是循环的起始节点。

以下是使用Floyd's循环查找算法解决链表循环问题的示例代码:

def find_start_of_loop(head):
    # Initialize tortoise and hare pointers
    tortoise = head
    hare = head
    is_loop = False
    
    # Find meeting point of tortoise and hare
    while hare and hare.next:
        tortoise = tortoise.next
        hare = hare.next.next
        if tortoise == hare:
            is_loop = True
            break
    
    # Reset tortoise pointer to head and keep hare pointer at meeting point
    if is_loop:
        tortoise = head
        while tortoise != hare:
            tortoise = tortoise.next
            hare = hare.next
        
        return tortoise
    
    return None

这样,我们就可以使用Floyd's循环查找算法来找到链表中循环的起始节点。

0