描述:
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
思路:
详看第二部分代码
代码:
第一次尝试的代码,待补齐:
/**
* 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 *p,*pre;
if(head==NULL || head->next == NULL )return head;
if(head->next->next==NULL && head->val!=head->next->val)return head;
p=head;
while(p->val==p->next->val){p=p->next;}
head=p;
pre=head;
while(p->next!=nullptr){
if(p->next->val==p->next->next->val){
p->next=p->next->next->next;//当某一位置的后两个位置相等时,直接把后面
//第三个位置接上,但是此时其他指针不动,依旧从当前位置开始算起,
//保证当前位置与下一位置是不同的
}
else{
pre=p;
p=p->next;
}
}
return head;
}
};
再来一个:
/**
* 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 *p,*pre;
if(!head)return head;
//加个头节点,主要是因为最开始几个节点如果连续相等就需要换头,因此干脆,整个换一个头,
//整体输出假头的下一个节点
ListNode *fakehead=new ListNode(0,head);
p=fakehead;
while(p->next && p->next->next){
if(p->next->val==p->next->next->val){
int x=p->next->val;
while(p->next && p->next->val == x){
p->next=p->next->next;
}
}
else{
p=p->next;
}
}
return fakehead->next;
}
};