Leetcode面试经典150题-82.删除排序链表中的重复元素II

之前写过这个题的基础第83题,看本文之前一定要先看懂这个Leetcode面试经典150题-82.删除排序链表中的重复元素II前序-83.删除排序链表中的重复元素_删除链表中重复的元素-CSDN博客

直接上代码了,解法都在代码里,不懂就留言或者私信

java 复制代码
/**
 * 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) {
        /**空链表或者只有1个的,不涉及这个问题,直接返回原链表即可*/
        if(head == null || head.next == null) {
            return head;
        }
        /**因为有换头的可能性,先用一个空节点作为头,这样后面出现换头也会挂在它后面,它后面最终的就是头*/
        ListNode dummy = new ListNode(-101);
        dummy.next = head;
        ListNode cur = dummy;
        ListNode next = null;
        ListNode nextNext = null;
        /**如果next节点为null,也没啥可遍历的了 */
        while(cur != null && cur.next != null && cur.next.next != null) {
            /**cur是我们确定了不会重复的节点,它的next和next.next就是接下来的两个节点
            如果两个节点不相同,就要next作为下个cur,否则两个都不要,如果后面出现很多个这个值也不要*/
            if(cur.next.val != cur.next.next.val) {
                cur = cur.next;
            } else {
                /**如果相等说明有重复,找到后面第一个不重复的*/
                int x = cur.next.val;
                /**往后一直找找到第一个和cur的next不同的节点,但是这个节点也不一定就不重复
                它还要执行if里的和它后面的节点是否相同的判断 */
                while(cur.next != null && cur.next.val == x) {
                    /**出循环的时候cur的next指向它后面第一个不相同的节点 */
                    cur.next = cur.next.next;
                }
            }
        }
        return dummy.next;

    }
}/**
 * 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) {
        /**空链表或者只有1个的,不涉及这个问题,直接返回原链表即可*/
        if(head == null || head.next == null) {
            return head;
        }
        /**因为有换头的可能性,先用一个空节点作为头,这样后面出现换头也会挂在它后面,它后面最终的就是头*/
        ListNode dummy = new ListNode(-101);
        dummy.next = head;
        ListNode cur = dummy;
        ListNode next = null;
        ListNode nextNext = null;
        /**如果next节点为null,也没啥可遍历的了 */
        while(cur != null && cur.next != null && cur.next.next != null) {
            /**cur是我们确定了不会重复的节点,它的next和next.next就是接下来的两个节点
            如果两个节点不相同,就要next作为下个cur,否则两个都不要,如果后面出现很多个这个值也不要*/
            if(cur.next.val != cur.next.next.val) {
                cur = cur.next;
            } else {
                /**如果相等说明有重复,找到后面第一个不重复的*/
                int x = cur.next.val;
                /**往后一直找找到第一个和cur的next不同的节点,但是这个节点也不一定就不重复
                它还要执行if里的和它后面的节点是否相同的判断 */
                while(cur.next != null && cur.next.val == x) {
                    /**出循环的时候cur的next指向它后面第一个不相同的节点 */
                    cur.next = cur.next.next;
                }
            }
        }
        return dummy.next;

    }
}
相关推荐
xu_yule几秒前
算法基础-(单调队列)
算法·单调队列
代码不停4 分钟前
Java递归综合练习
java·开发语言·算法·回归
前端小白在前进4 分钟前
力扣刷题:删除排序链表的重复元素Ⅱ
算法·leetcode·链表
qq_2147826111 分钟前
Hadley Wickham长文回顾:R语言tidyverse过去20年的演进之路、现状与未来展望!
python·算法·线性回归
霍田煜熙14 分钟前
C++ 部署小型图书管理系统
开发语言·c++·算法
ywwwwwwv14 分钟前
力扣300
算法·leetcode·职场和发展
来自于狂人17 分钟前
HCIE云计算超长考点精析
算法·贪心算法·云计算
Haooog18 分钟前
RabbitMQ面试题(不定时更新)
分布式·后端·面试·rabbitmq·消息中间件
@小码农20 分钟前
2025年厦门市小学生信息学竞赛C++(初赛)真题-附答案
开发语言·c++·python·算法·蓝桥杯
代码游侠21 分钟前
应用--Minishell实现
linux·运维·笔记·学习·算法