设单链表已非递减有序排列设计算法实现在单列表中删除值相同的多余节点。
时间: 2024-10-28 10:09:31 浏览: 17
将非递减有序的单链表中值相同的多余结点删除
5星 · 资源好评率100%
为了在非递减有序的单链表中删除所有值相同的多余节点,可以采用双指针法(Two Pointers Technique)。以下是简单的步骤:
1. 定义两个指针,初始化为头节点(假设为`head`)和`prev`(初始设为`nullptr`,用于保存前一个元素)。
2. 进入循环:
- 遍历链表,同时移动`current`指针,直到找到第一个不等于`prev`节点的元素。
- 如果`current`节点的值与`prev`节点的值相同,并且不是头节点(避免直接移除头节点的情况):
a. 更新`prev`的下一个节点为`current->next`,将当前节点从链表中移除,即`delete current`。
- 将`prev`更新为`current`,以便下一次比较。
- 当`current`到达链表尾部时,退出循环,因为已经遍历过所有连续相同的元素。
3. 循环结束后,`prev`就是新链表的最后一个节点,原头节点变为新链表的第一个节点。
下面是伪代码表示:
```cpp
Node* deleteDuplicates(Node* head) {
if (head == nullptr || head->next == nullptr)
return head;
Node *prev = nullptr, *current = head;
while (current != nullptr && current->val == prev->val) {
// 删除当前节点
prev->next = current->next;
delete current;
current = prev->next;
// 更新前驱指针,跳过相同的元素
prev = current;
}
return head;
}
```
阅读全文