这道题一开始以为是双指针问题…
Given a sorted linked list, delete all nodes that have duplicate
numbers, leaving only distinct numbers from the original list.For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given
1->1->1->2->3, return 2->3.
改了若干bug之后提交发现不对….
这个是要求把重复的全部删除…
于是思想就是:利用双指针c1,c2,c1始终在c2后,通过判断c2->val==c2->next->val来决定,此时用另一指针,一直找到不等的那个数为止~~
于是那个节点p赋值给c1->next,就可以跳过所有等值的c2
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL) return head;
//显然,肯定是利用和数组类似的双指针
ListNode root(-1);
root.next=head;
ListNode* c1;
ListNode* c2;
c1=&root;
c2=c1->next;
if(c2==NULL) return root.next;
int flag=0;
for(;c2!=NULL;){
if(c2->next!=NULL && c2->val==c2->next->val){
//一直找到不相等的那个p节点
ListNode *p=c2->next;
while(p!=NULL && p->val==c2->val) p=p->next;
//删除所有c2
c1->next=p;
c2=p;
}
else{
c1=c1->next;
c2=c2->next;
}
}
// c1->next=NULL;
return root.next;
}
};
嗯,终于没看题解搞定了
然后上一道题其实是要求只留一个的,那就比较简单了,贴代码。和数组的双指针的很像
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL) return head;
ListNode root(head->val-1);
//不要忘了这一步,将root链接到head上
root.next=head;
ListNode *c1;
ListNode *c2;
c1=&root;
c2=c1->next;
for(;c2!=NULL;c2=c2->next){
if(c1->val==c2->val){
c1->next=c2->next;
}
else c1=c1->next;
}
return root.next;
}
};