给定一个已排序的链表head , 删除原始链表中所有重复数字的节点,返回执行删除后的链表 。【保证链表已经按升序排列】】 KOF}Y8BJCSWYZS{CUCFC120.png 【输入形式】 输入链表的元素(链表长度大于等于0) 【输出形式】 输出执行删除后的链表元素。(若删除后链表长度为0,则什么都不输出) 【样例输入】 1 2 3 3 4 4 5 【样例输出】 1 2 5
时间: 2023-06-10 13:03:14 浏览: 44
好的,让我来帮您回答这个问题。
这道题可以使用双指针法进行求解。具体的实现流程如下:
首先,我们定义两个指针:一个指向当前合法节点的前一个节点 pre,一个指向当前遍历到的节点 cur。
然后,我们从头开始遍历链表,如果当前节点的值与下一个节点的值相等,说明当前节点需要被删除,我们就将 cur 指针向后移动,直到指向的节点值与原先的节点值不相等为止。
接着,我们还需要判断一下 pre 是否为头节点,如果是头节点的话,说明头节点需要被删除,需要更新头指针;如果不是,我们就将 pre 的下一个节点指向 cur 的下一个节点。
最后,我们将 cur 指向 pre 的下一个节点,进行下一轮遍历。
重复上述步骤,直到遍历完整个链表,最后返回新的头指针即可。
以下是具体的代码实现:
```
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) return head;
ListNode* dummy = new ListNode(-1, head);
ListNode *pre = dummy, *cur = head;
while (cur) {
bool flag = false;
while (cur->next && cur->val == cur->next->val) {
flag = true;
cur = cur->next;
}
if (flag) pre->next = cur->next;
else pre = cur;
cur = cur->next;
}
return dummy->next;
}
};
```
希望我的解答对您有所帮助,如果您还有其他问题,可以随时继续问我哦。