移除链表中的循环

2025年3月17日 | 阅读 3 分钟

在本主题中,我们将学习如何从链表中移除循环。到目前为止,我们已经学会了如何使用Floyd算法检测和找到循环的起始点。Floyd算法也将用于从链表中移除循环。

让我们通过一个例子来理解。

Remove the loop in a Linked List

我们知道慢指针每次移动一步,快指针每次移动两步。在上面的例子中,最初,慢指针和快指针都指向第一个节点,即节点 1。慢指针移动一步,快指针移动两步,慢指针和快指针分别指向节点 2 和节点 3,如下图所示:

Remove the loop in a Linked List

由于两个指针不指向同一个节点,我们将再次移动快指针和慢指针。现在,慢指针指向节点 3,而快指针指向节点 5,如下图所示:

Remove the loop in a Linked List

由于两个指针不指向同一个节点,我们将再次移动快指针和慢指针。现在,慢指针指向节点 4,而快指针指向节点 7,如下图所示:

Remove the loop in a Linked List

由于两个指针不指向同一个节点,我们将再次移动快指针和慢指针。现在,慢指针指向节点 5,而快指针指向节点 3,如下图所示:

Remove the loop in a Linked List

由于两个指针不指向同一个节点,我们将再次移动快指针和慢指针。现在,慢指针指向节点 6,而快指针指向节点 5,如下图所示:

Remove the loop in a Linked List

再次,两个指针(慢指针和快指针)不指向同一个节点,所以我们将再次移动快指针和慢指针。现在,慢指针指向节点 7,快指针也指向节点 7,如下图所示:

Remove the loop in a Linked List

如上例所示,慢指针和快指针在节点 7 相遇。我们创建一个名为 p1 的指针,指向两个指针相遇的节点 7,我们还创建了一个名为 p2 的指针,指向第一个节点,如下图所示:

Remove the loop in a Linked List

为了移除循环,我们将定义以下逻辑:

上述逻辑用于从链表中移除循环。while 循环将执行直到 p1.next 不等于 p2.next。当 p1.next 等于 p2.next 时,控制将跳出 while 循环,我们将 p1.next 设置为 Null。此语句会断开创建链表循环的链接。

C 语言实现移除循环

输出

Remove the loop in a Linked List