力扣82 删除排序列表中的重复元素II

力扣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节点,从而进行删除重复元素,具体做法:申请dummyHeadnext指向头结点headcur指针指向当前节点,pre指针指向当前节点的前一个节点,利用cur节点遍历链表,若当前节点与cur.next节点值相等,则需要使用循环,直到找到与cur.val值不等的节点,使用pre.next指向cur,而当前节点与cur.next节点值不相等时,则只需将precur指针往后移即可。


解决方案:

具体代码如下:

/**
 * 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;
    }
}
  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值