/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
// 如果链表为空,直接返回
if (head == nullptr) {
return nullptr;
}
// 创建一个哨兵节点(dummy node),使其指向头节点
// 这样可以方便地处理头节点可能被删除的情况
ListNode* dummy = new ListNode(0, head);
// current 指针用于构建不含重复元素的新链表
ListNode* current = dummy;
// 只要 current 后面至少还有两个节点,就继续检查
while (current->next != nullptr && current->next->next != nullptr) {
// 检查 current 后面的两个节点值是否相等
if (current->next->val == current->next->next->val) {
// 如果相等,说明遇到了重复序列
int x = current->next->val;
// 持续删除所有值为 x 的节点
while (current->next != nullptr && current->next->val == x) {
// 通过移动 next 指针来“删除”节点
current->next = current->next->next;
}
} else {
// 如果不相等,说明 current->next 是一个独特的节点,保留它
// 并将 current 移动到下一个位置
current = current->next;
}
}
// 返回哨兵节点指向的下一个节点,即新链表的头
ListNode* newHead = dummy->next;
delete dummy; // 释放为哨兵节点分配的内存
return newHead;
}
};