返回
删除中间节点:简洁剖析与精妙技巧
后端
2023-09-26 05:22:36
揭开序幕:概述问题与解决方案
旅程伊始,我们首先要了解问题所在。给你一个链表,你被要求删除其中的某个中间节点,同时分割链表,使其成为两个独立的链表。
要解决这个问题,我们需要从链表的结构入手。链表由一系列结点组成,每个结点包含两个值:数据值和下一个结点的指针。我们要删除的中间节点位于链表的中间位置,并且我们希望将链表一分为二,形成两个独立的链表。
第一幕:删除中间节点
删除中间节点听起来似乎是一件困难的任务,但其实可以轻松解决。首先,我们需要找到要删除的节点。我们可以通过遍历链表并计数的方式来实现。当我们找到目标节点时,我们可以简单地跳过它,并将它的下一个结点的指针指向它的前一个结点。这样,目标节点就会从链表中被删除。
第二幕:分割链表
在删除中间节点之后,我们需要将链表分割成两个独立的链表。这同样可以轻松实现。我们可以简单地从中间节点处将链表分成两部分。第一部分是原始链表的开始到中间节点的部分,第二部分是中间节点之后的部分。然后,我们可以将这两个部分的最后一个结点的指针分别指向 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)