📜  给定一个线段链表,删除中间点(1)

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

题目:给定一个线段链表,删除中间点

题目描述

给定一个线段链表,其中每个节点代表一个线段的起点和终点。删除链表中的中间点(即链表中节点数为奇数时,删除中间节点,节点数为偶数时,删除中间两个节点之一),保证链表中节点数至少为3。

解题思路

对于删除链表中间节点的问题,我们可以使用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表尾部时,慢指针恰好到达链表中间位置。这样我们就可以在O(n)的时间复杂度内找到链表中间节点。

接下来我们可以直接删除中间节点,或者将链表分为前半部分和后半部分,然后再将两部分拼接起来。这里实现了一种将链表分为前半部分和后半部分的方法。

代码实现
class Node:
    def __init__(self, start, end):
        self.start = start
        self.end = end
        self.next = None

def deleteMiddleNode(head):
    if not head or not head.next or not head.next.next:
        return head
    slow, fast = head, head.next.next
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    next = slow.next
    slow.next = next.next
    return head

# 测试
head = Node(1, 2)
node2 = Node(2, 3)
node3 = Node(3, 4)
node4 = Node(4, 5)
head.next = node2
node2.next = node3
node3.next = node4

deleteMiddleNode(head)
print(head.next.start)  # 输出:4
复杂度分析
  • 时间复杂度:O(n),其中 n 是链表长度。
  • 空间复杂度:O(1)。