题目
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
示例
示例一:
![](https://i-blog.csdnimg.cn/blog_migrate/b01e9225ac8228c1f852f9c6bf8328e3.png)
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例二:
![](https://i-blog.csdnimg.cn/blog_migrate/72facd1eb74229ace0193a5f368a8ca2.png)
输入:head = [1,1,1,2,3]
输出:[2,3]
解法:双指针
思路
用两个指针,两个指针中间间隔一个空位,是为了方便操作。当p3.val==p2.next.val时,说明p3开始出现重复,那么这个时候我们用一个变量flag保存这个重复的值,然后用while一直往下找,找到一个不是flag的值,那么这个p2之后到这个位置之前的都要删除掉,所以执行p2.next=p3,当然这其中还需要考虑指针是不是为空的情况,具体见代码,一个比较特殊的情况是所有数字都一样的情况。
![](https://i-blog.csdnimg.cn/blog_migrate/44a6ac4f072e97242998dbda51bb99a0.png)
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode p1=new ListNode();
p1.val=0;
p1.next=head;
ListNode p2=p1;
if(head==null){
return head;
}
ListNode p3=head.next;
int flag=-101;
while(p3!=null){
if(p3.val==p2.next.val){
flag=p3.val;
while(p3!=null&&p3.val==flag){
p3=p3.next;
}
p2.next=p3;
//要考虑全部都是相同的情况
if(p3!=null){
p3=p3.next;
}
}else{
p2=p2.next;
p3=p3.next;
}
}
return p1.next;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/0c56ac4187064afcbc8fb9cd09ce28ab.png)