删除带头结点单链表中值相同的元素
时间: 2024-12-19 14:27:15 浏览: 10
带头结点的单循环链表,删除所有值大于min,小于max的结点的算法
删除带头结点的单链表中值相同的元素,通常需要遍历整个链表,并在遍历时检查当前节点的值是否与其前驱节点的值相等。如果相等,就将前驱节点指向当前节点的下一个节点,从而跳过已存在的相同值。以下是基本步骤:
1. 定义两个指针,`prev` 和 `current`,分别初始化为头结点和头结点的下一个节点。
2. 当 `current` 非空时,继续循环:
a. 检查 `current` 的值是否等于 `prev` 的值。如果是,说明有一个重复的元素,不需要保留。
b. 如果它们不同,则更新 `prev` 为 `current`,并移到下一个节点,即 `prev = current.next`。
c. 继续比较下一个节点,直到 `current` 变为空。
3. 最后,`prev` 将指向新链表的最后一个节点,因为所有重复值都已经从链表中移除。
```cpp
struct ListNode {
int val;
ListNode* next;
};
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head; // 如果只有一个元素或者链表为空,无需删除
}
ListNode dummy(0); // 创建虚拟头节点,避免处理边界情况
dummy.next = head;
ListNode* prev = &dummy;
ListNode* current = head;
while (current != nullptr) {
if (current->val == prev->val) { // 如果当前节点和前一个节点的值相同
ListNode* nextNode = current->next;
prev->next = nextNode;
free(current); // 释放当前节点的内存
current = nextNode;
} else {
prev = current;
current = current->next;
}
}
return dummy.next; // 返回实际的新头节点
}
```
阅读全文