题目的链接在这里:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
题目大意
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
一、示意图
二、解题思路
双指针
双指针
代码如下:
/**
* 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) {
//先进行边界判断
if(head==null){
return null;
}
if(head.next==null){
return head;
}
//删除重复出现的元素 那肯定是需要双指针 一个指前面 一个指后面了 而且是需要把重复的全都取消掉的 所以是不是需要把头指针也变成一个正常指针呢
ListNode temp = new ListNode();
temp.next=head;
ListNode res=temp;
//此时就变成了 头指针也是正常的指针了
while (head!=null&&head.next!=null){
ListNode n=head.next;
//需要把让head和后面这个值作比较
if(n.val!=head.val){
//那就说明这两个不相等 head就可以往后移动
head=head.next;
temp=temp.next;
}else{
//说明这两个相等 那就继续找 直到找到第一个不为这个值的执政
while (n.next!=null&&(n.val==n.next.val)){
//就继续往后移
n=n.next;
}
//这个之后 要么n.next是null了,要么n.next的值不是val了 都可以删
temp.next=n.next;
head=temp.next;
}
}
return res.next;
}
}