返回

删除中间节点:简洁剖析与精妙技巧

后端

揭开序幕:概述问题与解决方案

旅程伊始,我们首先要了解问题所在。给你一个链表,你被要求删除其中的某个中间节点,同时分割链表,使其成为两个独立的链表。
要解决这个问题,我们需要从链表的结构入手。链表由一系列结点组成,每个结点包含两个值:数据值和下一个结点的指针。我们要删除的中间节点位于链表的中间位置,并且我们希望将链表一分为二,形成两个独立的链表。

第一幕:删除中间节点

删除中间节点听起来似乎是一件困难的任务,但其实可以轻松解决。首先,我们需要找到要删除的节点。我们可以通过遍历链表并计数的方式来实现。当我们找到目标节点时,我们可以简单地跳过它,并将它的下一个结点的指针指向它的前一个结点。这样,目标节点就会从链表中被删除。

第二幕:分割链表

在删除中间节点之后,我们需要将链表分割成两个独立的链表。这同样可以轻松实现。我们可以简单地从中间节点处将链表分成两部分。第一部分是原始链表的开始到中间节点的部分,第二部分是中间节点之后的部分。然后,我们可以将这两个部分的最后一个结点的指针分别指向 nullptr,这样就完成了分割。

第三幕:代码实现

现在,我们已经了解了删除中间节点和分割链表的技巧。让我们看看如何在 C++ 和 Python 中实现这些操作。

C++ 代码示例:

// 定义结点结构
struct Node {
    int data;
    Node* next;
    Node(int data, Node* next = nullptr) : data(data), next(next) {}
};

// 删除链表中的中间节点
void deleteMiddleNode(Node* head) {
    if (head == nullptr || head->next == nullptr) {
        return;
    }

    // 找到链表的长度
    int length = 0;
    Node* curr = head;
    while (curr != nullptr) {
        length++;
        curr = curr->next;
    }

    // 计算中间节点的位置
    int middle = length / 2;

    // 遍历链表,找到中间节点
    curr = head;
    for (int i = 0; i < middle - 1; i++) {
        curr = curr->next;
    }

    // 删除中间节点
    Node* temp = curr->next;
    curr->next = curr->next->next;
    delete temp;
}

// 分割链表
void splitList(Node* head, Node*& left, Node*& right) {
    if (head == nullptr || head->next == nullptr) {
        left = head;
        right = nullptr;
        return;
    }

    // 找到链表的中间节点
    int length = 0;
    Node* curr = head;
    while (curr != nullptr) {
        length++;
        curr = curr->next;
    }

    int middle = length / 2;

    // 遍历链表,找到中间节点
    curr = head;
    for (int i = 0; i < middle - 1; i++) {
        curr = curr->next;
    }

    // 将链表分成两部分
    left = head;
    right = curr->next;
    curr->next = nullptr;
}

// 打印链表
void printList(Node* head) {
    while (head != nullptr) {
        std::cout << head->data << " ";
        head = head->next;
    }
    std::cout << std::endl;
}

// 测试代码
int main() {
    Node* head = new Node(1);
    head->next = new Node(2);
    head->next->next = new Node(3);
    head->next->next->next = new Node(4);
    head->next->next->next->next = new Node(5);

    std::cout << "Original list: ";
    printList(head);

    deleteMiddleNode(head);

    std::cout << "List after deleting middle node: ";
    printList(head);

    Node* left = nullptr;
    Node* right = nullptr;
    splitList(head, left, right);

    std::cout << "Left list: ";
    printList(left);

    std::cout << "Right list: ";
    printList(right);

    return 0;
}

Python 代码示例:

# 定义结点类
class Node:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next

# 删除链表中的中间节点
def delete_middle_node(head):
    if head is None or head.next is None:
        return

    # 计算链表的长度
    length = 0
    curr = head
    while curr is not None:
        length += 1
        curr = curr.next

    # 计算中间节点的位置
    middle = length // 2

    # 遍历链表,找到中间节点
    curr = head
    for i in range(middle - 1):
        curr = curr.next

    # 删除中间节点
    temp = curr.next
    curr.next = curr.next.next
    del temp

# 分割链表
def split_list(head, left, right):
    if head is None or head.next is None:
        left = head
        right = None
        return

    # 计算链表的长度
    length = 0
    curr = head
    while curr is not None:
        length += 1
        curr = curr.next

    # 计算中间节点的位置
    middle = length // 2

    # 遍历链表,找到中间节点
    curr = head
    for i in range(middle - 1):
        curr = curr.next

    # 将链表分成两部分
    left = head
    right = curr.next
    curr.next = None

# 打印链表
def print_list(head):
    while head is not None:
        print(head.data, end=" ")
        head = head.next
    print()

# 测试代码
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
head.next.next.next.next = Node(5)

print("Original list:", end=" ")
print_list(head)

delete_middle_node(head)

print("List after deleting middle node:", end=" ")
print_list(head)

left = None
right = None
split_list(head, left, right)

print("Left list:", end=" ")
print_list(left)

print("Right list:", end=" ")
print_list(right)