📜  Python程序删除链表中间(1)

📅  最后修改于: 2023-12-03 15:34:31.509000             🧑  作者: Mango

Python程序删除链表中间

本文介绍如何使用Python编写删除链表中间节点的程序。假设我们已经有一个单向链表,每个节点包含两个属性:值和下一个节点的指针。目标是删除链表的中间节点,即链表的中间节点不能是第一个或最后一个节点。

算法思路

为了删除链表的中间节点,我们需要使用两个指针,一个指针指向链表的头节点,一个指针指向中间节点的前一个节点。首先,我们需要遍历一遍链表,计算出链表的长度。然后,我们可以使用快慢指针的方法来找到链表的中间节点,并记录中间节点的前一个节点,最后删除中间节点即可。

程序实现

首先定义链表节点Node类及Linked List类,代码如下:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

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

接着,我们需要实现删除中间节点的方法。在这个方法中,我们使用了两个指针slow和fast,初始值都指向链表的头节点。fast指针每次向前移动两个节点,slow指针每次向前移动一个节点。当fast指针到达链表的末尾时,slow指针指向链表的中间节点的前一个节点。

    def delete_middle_node(self):
        if not self.head:
            return

        length = 0
        cur = self.head
        while cur:
            length += 1
            cur = cur.next

        if length <= 2:
            return

        middle = length // 2 + 1
        slow = self.head
        fast = self.head.next

        while fast and middle > 2:
            slow = slow.next
            fast = fast.next.next
            middle -= 1

        slow.next = slow.next.next

在这个方法中,我们首先判断链表是否为空,如果为空就直接返回。然后我们遍历一遍链表,计算出链表的长度。如果链表的长度小于等于2,那么我们就不能删除链表的中间节点,直接返回即可。

接着,我们计算出链表的中间位置,并使用快慢指针的方法找到中间节点的前一个节点slow。最后,我们将slow的next指向下一个节点,即删除了中间节点。

使用演示

为了演示这个方法,我们可以创建一个包含多个节点的链表,并删除链表的中间节点。代码如下:

a = Node(1)
b = Node(2)
c = Node(3)
d = Node(4)
e = Node(5)
f = Node(6)

a.next = b
b.next = c
c.next = d
d.next = e
e.next = f

ll = LinkedList(a)

print("Before delete:")
cur = ll.head
while cur:
    print(cur.value)
    cur = cur.next

ll.delete_middle_node()

print("After delete:")
cur = ll.head
while cur:
    print(cur.value)
    cur = cur.next

这个程序会输出如下结果:

Before delete:
1
2
3
4
5
6
After delete:
1
2
4
5
6

可以看到,中间节点3已经被删除了。

总结

本文介绍了如何使用Python编写删除链表中间节点的程序。这个方法的时间复杂度是O(n),空间复杂度是O(1),效率很高。如果读者对链表的操作比较熟悉,可以自己尝试编写该算法,以加深对单向链表的理解。