java leetcode之[中等]82. 删除排序链表中的重复元素 II

该博客主要讲解了一道LeetCode上的算法问题——如何删除排序链表中的重复元素。作者采用双指针法,通过两个指针head和n分别指向当前节点和下一个节点,比较它们的值来决定是否删除重复元素。当遇到相等的值时,会继续遍历直到找到第一个不同的值,然后更新链表。这种方法确保了结果链表依然有序。
摘要由CSDN通过智能技术生成

题目的链接在这里: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;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值