1.题目
给定已排序的链表,删除所有具有重复数字的节点,只留下原始列表中的不同数字。
示例:
Input: 1->2->3->3->4->4->5 Output: 1->2->5
2.思路
新建链表头结点指针 dummy
如果当前节点cur的值与下一个节点的值相同,两个节点都需要被删除。
为了保证删除链表之后的链表仍然是相连的,当前节点的前一个节点pre 和后边比cur值大的节点相连。
3.实现
/**
* 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) {
ListNode dummy = ListNode(0);
dummy.next = head;
// pre 指向链表 head 的前一个位置。
ListNode* pre = &dummy;
ListNode* cur = head;
while (cur != nullptr) {
// 1. 先找到两个不相等的节点
while (cur != nullptr && cur->next != nullptr && cur->val == cur->next->val) {
cur = cur->next;
}
// 2. 判断是否有重复的数字
if (pre->next == cur) {
pre = cur;
} else if (cur != nullptr) {
pre->next = cur->next;
}
cur = cur->next;
}
return dummy.next;
}
};