题目描述:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例:
输入:
head = [1,2,3,3,4,4,5]
输出:
[1,2,5]
思路:
1. 首先拿到这个题,最初的想法是判断 当前节点【ptr】的 后继【ptr->next】是否和 后继的后继 【ptr->next->next】的值相等,然后通过循环去把后面相同的节点略过,然后将【ptr】的后继拼接到第一个值不相等的结点。
2. 结果发现【开头就重复】的样例(如:head = [2,2,3,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* ptr = head;
//判断头节点会不会重复
while (head && head->next && head->val == head->next->val){
int headval = head->val;
while(head && head->val==headval) head = head->next;
}
//判断剩余节点会不会重复
while(ptr&&ptr->next&&ptr->next->next){
if (ptr->next->val == ptr->next->next->val){
ListNode* tmp = ptr->next->next;
while(tmp && tmp->val == ptr->next->val){
tmp = tmp->next;
}
ptr->next = tmp;
}else{
ptr = ptr->next;
}
}
return head;
}
};