设单链表以非递减有序排列,设计算法删除单链表多余重复相同结点
时间: 2024-10-25 08:02:20 浏览: 28
将非递减有序的单链表中值相同的多余结点删除
5星 · 资源好评率100%
当需要保持单链表非递减有序排列,并删除所有重复的节点时,可以采用遍历链表的方式来实现这个算法。以下是基本步骤:
1. 定义两个指针,`current` 和 `prev`,初始时分别指向头节点和空指针。
2. 遍历链表:
- 如果当前节点(`current`)的值等于前一个节点(`prev`),说明有重复,将`prev`节点跳过(不更新`prev`)。
- 否则,如果`current`的值大于`prev`,则表示序列是有序的,更新`prev`为`current`,然后继续前进到下一个节点(`current = current.next`)。
3. 当遍历完链表后,`prev`会停在最后一个有效的不重复节点上。此时,链表的头节点就是去重后的第一个节点。
4. 返回链表头节点,作为新的有序链表。
```cpp
struct ListNode {
int val;
ListNode *next;
};
ListNode* removeDuplicates(ListNode* head) {
if (!head || !head->next) return head; // 如果链表为空或只有一个元素,无需处理
ListNode dummy(0);
dummy.next = head;
ListNode *prev = &dummy;
ListNode *current = head;
while (current) {
if (current->val == prev->val) {
prev = current;
continue;
}
if (current->val > prev->val) {
prev->next = current;
prev = current;
}
current = current->next;
}
prev->next = nullptr; // 结束循环后,prev指向最后的有效节点
return dummy.next;
}
```
阅读全文