设单链表已非递减有序排列,设计C++算法实现在单链表中删除值相同的多余节点。
时间: 2024-10-28 08:09:22 浏览: 36
C++ 实现带头节点的单链表
为了在非递减有序的单链表中删除所有值相同的多余节点,你可以使用迭代的方式来遍历链表,并维护两个指针。第一个指针用于遍历整个列表,第二个指针(如果其值等于当前节点值)则跳过该节点,直到找到下一个不同的值。然后更新第一个指针指向新的节点,继续这个过程直到链表末尾。
以下是简单的C++代码实现:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* removeDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr || head->val != head->next->val)
return head; // 如果链表为空,或者头结点的值不等于下一个节点,直接返回
ListNode dummy(0); // 创建虚拟头节点,便于处理链表首部的情况
dummy.next = head;
ListNode *prev = &dummy;
ListNode *current = head->next;
while (current != nullptr) {
if (current->val == prev->next->val) {
prev->next = current->next;
} else {
prev = current;
}
current = current->next;
}
return dummy.next; // 返回实际的头节点
}
// 测试函数
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != nullptr) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
int main() {
// 示例链表:1 1 2 3 3 4 4 4
ListNode* list = new ListNode(1);
list->next = new ListNode(1);
list->next->next = new ListNode(2);
list->next->next->next = new ListNode(3);
list->next->next->next->next = new ListNode(3);
list->next->next->next->next->next = new ListNode(4);
list->next->next->next->next->next->next = new ListNode(4);
list->next->next->next->next->next->next = new ListNode(4);
printList(list); // 输出:1 1 2 3 3 4 4 4
list = removeDuplicates(list);
printList(list); // 输出:1 2 3 4
return 0;
}
```
阅读全文