📌  相关文章
📜  数据结构示例-删除循环链表中间节点(1)

📅  最后修改于: 2023-12-03 14:54:57.319000             🧑  作者: Mango

数据结构示例-删除循环链表中间节点

简介

本文介绍了如何在循环链表中删除中间节点的示例代码。循环链表是一种特殊类型的链表,其中最后一个节点链接到第一个节点,形成一个循环。删除循环链表中的中间节点可以通过改变节点的指针来实现。

实现方式

下面是一个示例函数,用于删除循环链表中的中间节点。

def delete_middle_node(node):
    slow_ptr = fast_ptr = node
    prev = None

    if node is None:
        return

    while fast_ptr and fast_ptr.next:
        fast_ptr = fast_ptr.next.next
        prev = slow_ptr
        slow_ptr = slow_ptr.next

        if fast_ptr == node:
            break

    prev.next = slow_ptr.next
    slow_ptr = None
代码说明
  • 算法维护两个指针,fast_ptrslow_ptr,初始都指向循环链表的头节点 node
  • 快指针 fast_ptr 每次移动两步,慢指针 slow_ptr 每次移动一步。因为链表是循环的,所以快指针能够在慢指针遍历完链表一周之前追上慢指针。
  • 每次移动慢指针之前,保存其前一个节点的指针 prev
  • 当快指针与慢指针相遇时,表示慢指针在链表的中间位置。此时将 prevnext 指针指向慢指针的下一个节点,同时将慢指针置为 None
  • 最后返回的循环链表中间节点已被成功删除。
示例

调用以上函数的示例代码如下:

# 创建循环链表
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
    
# 创建链表节点
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)

# 构建循环链表
n1.next = n2
n2.next = n3
n3.next = n4
n4.next = n1

# 删除中间节点
delete_middle_node(n3)

# 打印链表
current = n1
while current.next != n1:
    print(current.data, "->", end=" ")
    current = current.next
print(current.data)

上述示例代码的运行结果将打印出 1 -> 2 -> 4,中间节点 3 已被成功删除。

总结

本文介绍了如何在循环链表中删除中间节点的示例代码。通过维护两个指针,快指针和慢指针,可以找到中间节点,并进行删除操作。要注意在循环链表中删除节点时,需要正确改变节点的指针来维护链表的连续性。