题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题思路:总体思路就是把每个不重复的值重新重新放到一个新的链表里面即可,需要一个新的头节点,两个指针,一个做当前指针,一个做扫描指针。
代码描述:
/**
* 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||!head->next) return head;
ListNode* Nhead=new ListNode(0);
//Nhead->next=head;
ListNode* r=Nhead;//新的链表
ListNode* p=head;//当前指针
ListNode* q=head;//扫描指针
while(q&&q->next){
//这里的q本身是不用判断的,因为开头已经判断过了,但是LeetCode的编译器很奇怪 诶
while(q->next&&q->next->val==p->val) q=q->next;
//当p的值与q的值相同时,扫描指针向后移。这里的q->next也不用判断,因为第一个while判断过了
if(p==q){//p=q也就是说扫描指针没有向后移动,所以将其添加到新链表里
r->next=p;
r=p;
}
q=q->next;
p=q;
}
r->next=p;//把最后一个数添加到新链表里
return Nhead->next;
}
};