力扣82 删除排序列表中的重复元素II:
提示:使用dummyHead
问题描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。
提示:
- 链表中节点数目在范围 [0, 300] 内
- 100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
@Override
// 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; }
}
题解分析:
提示:使用dummyHead
dummyHead
方便保存pre
节点,从而进行删除重复元素,具体做法:申请dummyHead
的next
指向头结点head
,cur
指针指向当前节点,pre
指针指向当前节点的前一个节点,利用cur
节点遍历链表,若当前节点与cur.next
节点值相等,则需要使用循环,直到找到与cur.val
值不等的节点,使用pre.next
指向cur
,而当前节点与cur.next
节点值不相等时,则只需将pre
和cur
指针往后移即可。
解决方案:
具体代码如下:
/**
* 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 head;
//创建dummyHead
ListNode dummyHead=new ListNode(-1);
//创建pre指针并指向dummyHead
ListNode pre=dummyHead;
//将dummyHead的next指向head
pre.next=head;
//创建遍历指针
ListNode cur=head;
while(cur!=null&&cur.next!=null){
//如果当前节点的值等于下一个节点值...
if(cur.val==cur.next.val){
//保存当前节点的值
int temp=cur.val;
//找到与当前节点不同的值,并进行删除操作
while(cur!=null&&cur.val==temp){
cur=cur.next;
}
pre.next=cur;
}else{
//否则直接往后遍历
pre=cur;
cur=cur.next;
}
}
return dummyHead.next;
}
}