问题描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例2:
输入:head = [1,1,1,2,3]
输出:[2,3]
解题思路
这道题和83. 删除排序链表中的重复元素不一样的是,不保留重复元素,重复元素全部删除。
所以,如果所有元素全部相同,最终返回的链表可能是空。
对于这种问题,可以构造一个哑节点指向链表头节点;
由于这道题是删除所有重复元素,所以遍历的区间必然至少有两个元素才可能有重复元素;
假设当前遍历区间cur到尾节点,那么必然循环的条件是cur->next和cur->next->next都不等于空;
在具体的每次循环中:
如果cur->next和cur->next->next的值相等,那么说明至少有两个重复元素,那么逐个删除即可,直到cur->next不再是重复元素;
如果cur->next和cur->next->next的值不想等,那么说明cur->next节点指向的值不存在重复节点,直接移动到下一个节点即可;
代码实现
/**
* 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 *dumpNode = new ListNode(-200);
dumpNode->next = head;
ListNode *curPtr = dumpNode;
//至少有两个节点才有可能进入删除节点的操作
while(curPtr->next && curPtr->next->next) {
if(curPtr->next->val == curPtr->next->next->val) {
//有两个重复节点时,才循环删除重复节点
int x = curPtr->next->val;
while(curPtr->next && curPtr->next->val == x) {
curPtr->next = curPtr->next->next;
}
}
else {
curPtr = curPtr->next;
}
}
return dumpNode->next;
}
};
这篇博客探讨了如何删除已排序链表中的所有重复元素,使得链表仅包含不同的数字。解题思路是使用哑节点指向链表头,然后遍历链表,若发现相邻节点值相同,则连续删除重复节点,直至找到不同值节点。最终提供了一段代码实现来解决这个问题。
722

被折叠的 条评论
为什么被折叠?



