题目
给定一个已排序的链表的头 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;
}
}
|