📅  最后修改于: 2023-12-03 15:40:53.211000             🧑  作者: Mango
线段链接列表中可能存在不必要的中间点,这些中间点会影响程序的效率。因此,需要一种方法来删除这些中间点。
以下是用于从线段链接列表中删除中间点的C++程序的示例代码:
#include <iostream>
#include <cstdlib>
using namespace std;
//定义节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//删除函数,本题的核心部分
ListNode* deleteMiddleNode(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode *slow = head, *fast = head->next;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}
ListNode *mid = slow->next;
slow->next = mid->next;
delete mid;
return head;
}
//主函数
int main() {
ListNode* head = new ListNode(1); //创建链表
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);//构造一个简单的链表,用于测试
cout << "删除中间节点前的链表: ";
for (ListNode* curr = head; curr != NULL; curr = curr->next) { //输出前的链表
cout << curr->val << " ";
}
cout << endl;
head = deleteMiddleNode(head); //删除中间节点
cout << "删除中间节点后的链表: ";
for (ListNode* curr = head; curr != NULL; curr = curr->next) { //输出后的链表
cout << curr->val << " ";
}
cout << endl;
return 0;
}
该程序使用了快慢指针的方法,先找到中间节点,然后删除该节点即可。
删除中间节点前的链表: 1 2 3 4 5
删除中间节点后的链表: 1 2 4 5
注意,在使用该程序时,需要根据自己的需要修改构建链表的代码,以及在main函数中进行测试。