给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
class ListNode {
public:int val;ListNode* next;ListNode(int _val) {val = _val;next = nullptr;}
};ListNode* deleteDuplicates(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}ListNode dummy(0);dummy.next = head;ListNode* pre = &dummy;ListNode* cur = head;while (cur != nullptr) {bool duplicated = false;while (cur->next != nullptr && cur->val == cur->next->val) {duplicated = true;ListNode* temp = cur;cur = cur->next;delete temp;}if (duplicated) {pre->next = cur->next;delete cur;cur = pre->next;} else {pre = cur;cur = cur->next;}}return dummy.next;
}
通过使用双指针 pre 和 cur 遍历链表,同时使用一个布尔变量 duplicated 来标记当前节点是否为重复节点。在遍历过程中,如果发现当前节点与下一个节点值相同,则将 duplicated 设置为 true,直到找到不同值的节点或遍历结束。接着根据 duplicated 的值来删除重复节点或保留不同节点,并更新指针位置,直至遍历完成。最终返回处理后的链表头节点
具体的删除步骤如下:
初始化双指针 pre 和 cur,并将 pre 指针指向一个虚拟头节点。
将 cur 指针指向 head,开始遍历链表。
在遍历过程中,发现 cur->val 与 cur->next->val 相同,即 3 == 3,则将 duplicated 设置为 true,并删除重复节点 3 和 3。
更新指针位置,将 pre->next 指向下一个不重复的节点 4,并删除重复节点 4。
继续遍历,发现 cur->val 与 cur->next->val 不相同,即 4 != 5,则保留节点 5。
完成遍历后,返回处理后的链表头部,即 [1,2,5]。