📅  最后修改于: 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