有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 输入 8 1 4 1 2 2 1 3 4 输出 1 4 2 3 样例输入 8 1 4 1 2 2 1 3 4 样例输出 1 4 2 3用c++语言写出上述程序代码
时间: 2024-09-22 11:05:39 浏览: 45
要设计一个C++代码来实现这个功能,你可以先定义一个结构体表示链表的节点,并使用两个指针`prev`和`current`来辅助找到不重复的节点,并更新头结点。下面是完整的程序代码:
```cpp
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 创建单链表并插入值(已实现)
ListNode* CreateListTail(int n, std::istream& input) {
ListNode* head = new ListNode(0);
ListNode* tail = head;
int num;
while (input >> num) {
ListNode* newNode = new ListNode(num);
if (tail->next == nullptr) {
tail->next = newNode;
} else {
tail->next->next = newNode;
}
tail = newNode;
}
return head->next; // 头指针指向第二个节点
}
// 删除重复的值并在原位置替换(实现删除后的合并操作)
ListNode* MergeAndDeleteDuplicates(ListNode*& current, ListNode*& prev) {
if (prev == nullptr || prev->val != current->val) {
return current; // 值不同或第一次出现,返回节点
}
ListNode* newCurrent = current->next;
if (newCurrent != nullptr) {
prev->next = MergeAndDeleteDuplicates(newCurrent, current); // 调用自身,处理链表后续部分
}
delete current; // 删除重复节点
return prev; // 更新 prev 指针以跳过当前值
}
ListNode* DeleteDuplicates(ListNode* head) {
ListNode* prev = nullptr;
ListNode* current = head;
while (current != nullptr) {
head = MergeAndDeleteDuplicates(current, prev); // 处理每个链节直到最后一个
current = current->next;
prev = head; // 更新 prev 以便下一次处理下一个不同值
}
return head;
}
int main() {
int n;
std::cin >> n;
std::istringstream iss("(1 4 1 2 2 1 3 4)");
ListNode* listHead = CreateListTail(n, iss);
cout << "原始链表:" << endl;
PrintList(listHead); // 主函数中可能需要自定义的 PrintList 方法
listHead = DeleteDuplicates(listHead);
std::cout << "删除重复节点后:\n";
PrintList(listHead);
return 0;
}
相关的命令式编程问题是:
1. 在C++的链表操作中,如何遍历一个双向链表?
2. 判断一个链表中有无环路的算法是什么?
3. 当链表中的元素全部相同时,该如何处理?
阅读全文