题目

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例1: 输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]

示例2: 输入:head = [1,1,1,2,3] 输出:[2,3]

解题思路

使用一个临时头节点,指向头节点,从头节点开始判断当前节点是否是重复节点,如果重复则使用pre节点指向当前节点的next,即可删除重复节点,有连续重复的case,把当前节点右移直到遇到不相等的节点,最后返回临时头节点的next即可。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * 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 preHead=new ListNode(-1);//临时头节点
        preHead.next=head;
        ListNode pre=preHead,cur=head;
        while(cur !=null && cur.next !=null){
            //当前节点和下一个节点比较是否相等
            if(cur.val==cur.next.val){
                //处理连续相等的数字
                while(cur.next !=null && cur.val==cur.next.val){
                    cur=cur.next;
                }
                //删除重复的数字
                pre.next=cur.next;
                cur=cur.next;
            }else{
                pre=cur;
                cur=cur.next;
            }
        }
        return preHead.next;
    }
}