✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。
数据范围
链表中节点 val 值取值范围 [0,100]。
链表长度 [0,100]。样例1
输入:1->2->3->3->4->4->5 输出:1->2->5
- 1
- 2
- 3
样例2
输入:1->1->1->2->3 输出:2->3
- 1
- 2
- 3
这题我们可以创建一个新的头结点出来,方便我们去处理后续结点。但是,我们下面演示操作的时候是直接在链表上进行处理,这样大家能够看得更清楚一些。
然后我们分两种情况来讨论,分别是出现重复结点的情况和无重复结点的情况。
情况一: 出现重复结点时,我们会用一个指针 q
去找到下一个值。
可以用 while
循环进行查找,找到直到与 p->next
的值不同为止。
情况二: 当前遍历的是不重复的结点,还是进行同样的判断操作。
由于没有重复的元素, q
经过 while
循环后只会向后移一位。所以 p->next->next
就是 q
,故直接将 p
往后移一位即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* p = dummy;
while (p->next)
{
ListNode* q = p->next;
while (q && p->next->val == q->val) q = q->next;
if (p->next->next == q) p = p->next; //没有重复元素
else p->next = q; //有重复元素
}
return dummy->next;
}
};
欢迎大家在评论区交流~