力扣83. 删除排序链表中的重复元素(java常规解法 + 建立虚拟头节点)

news/2024/7/24 9:31:53 标签: leetcode, 链表, java

Problem: 83. 删除排序链表中的重复元素

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

常规解法:一次遍历,每次判断若当前节点值和其下一个节点值,若相等则当前节点指向其下一个节点的下一个节点。
建立虚拟头节点和尾指针(准确来说应该是一种技巧):建立虚拟头节点和尾指针,遍历时当当前指向的节点值和尾指针指向的节点值不同时将其添加到尾指针上。

解题方法

常规解法:

1.循环退出条件为cur != null && cur.next != null(cur为开始定义指向链表头节点并且用于遍历链表的辅助指针);
2.每次判断若当前节点值和其下一个节点值,若相等则当前节点指向其下一个节点的下一个节点;否则直接迭代(cur = cur.next)

建立虚拟头节点和尾指针:

1.建立虚拟头节点,辅助遍历指针指向链表头,尾指针指向建立的虚拟头节点该操作能够较好的解决原始待删除链表头部就存在重复值的情况
2.循环退出条件为辅助遍历指针不为空
3.若辅助遍历指针当前指向的节点值和尾指针指向的节点值不相同,则让尾指针指向该节点,否则正常迭代遍历(实际操作细节看代码)
4.返回虚拟头节点的下一个节点

复杂度

常规解法:

  • 时间复杂度:

O ( n ) O(n) O(n)

  • 空间复杂度:

O ( 1 ) O(1) O(1)

建立虚拟头节点和尾指针:

  • 时间复杂度:

O ( n ) O(n) O(n)

  • 空间复杂度:

O ( 1 ) O(1) O(1)

Code

常规解法:

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 {
    //Time Complexity: O(n)
    //Space Complexity: O(1)
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return null;
        ListNode cur = head;
        //当当前节点和其下一个节点均不为null
        while (cur != null && cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return head;
    }

}

建立虚拟头节点和尾指针:

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 {
    //Time Complexity: O(n)
    //Space Complexity: O(1)
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return null;
        //建立虚拟头节点
        ListNode dummyNode = new ListNode(-666);
        dummyNode.next = head;
        //建立头指针和尾指针
        ListNode p = head;
        //尾指针指向虚拟头节点
        ListNode tail = dummyNode;
        while (p != null) {
            //先将下一个节点取出
            ListNode nextNode = p.next;
            if (p.val != tail.val) {
                tail.next = p;
                tail = p;
                tail.next = null;
            }
            p = nextNode;
        }
        return dummyNode.next;
    }
        
}

http://www.niftyadmin.cn/n/5187199.html

相关文章

List 删除其中的空元素或者null元素

1、Collections.singleton() 一个用于创建只包含一个元素的不可变​​集合​​的方法,创建一个只包含一个值为null的元素的集合。 list.removeAll(Collections.singleton(null)); list.removeAll(Collections.singleton(""));2、使用 for 循环&#xff0…

【Java 进阶篇】JQuery 遍历 —— For 循环的奇妙之旅

在前端开发的世界里,遍历是一个常见而重要的操作。它让我们能够浏览并操纵文档中的元素,为用户提供更加丰富和交互性的体验。而在 JQuery 中,遍历的方式多种多样,其中 for 循环是一种简单而灵活的选择。在本篇博客中,我…

2023鸿蒙预定未来,环境搭建学习

鸿蒙开发基础知识 鸿蒙的基本概念和特点 鸿蒙(HarmonyOS)是华为公司开发的一款全场景分布式操作系统。它的设计目标是为各种设备提供统一的、无缝的用户体验。鸿蒙的核心特点包括以下几个方面: 分布式架构:鸿蒙采用分布式架构&…

关于 内部类 你了解多少?(详解!!)

目录 1. 什么是内部类? 2. 内部类的分类 3. 内部类 3.1 实例内部类 3.2 静态内部类 4. 局部内部类 5. 匿名内部类 6.对象的打印 “不积跬步无以至千里,不积小流无以成江海。”每天坚持学习,哪怕是一点点!!&a…

rsync远程同步(rsync+inotify)

目录 一、概述 1、关于rsync 2、rsync的特点: 3、备份方式: 4、同步方式: 二、rsync相关命令 1、rsync常用命令的选项: 2、启动和关闭rsync服务: 3、关闭 rsync 服务 三、 免交互: 1、免密同步&a…

ERP管理系统:企业升级的秘密武器

ERP管理系统:企业升级的秘密武器 在当今快速发展的商业环境中,企业要想保持竞争力,就必须不断进行自我升级。而在这个过程中,ERP管理系统以其强大的功能和优化流程的能力,逐渐成为了企业升级的秘密武器。 一、ERP管理…

impdp导出出现ORA-39155、ORA-48128、ORA-19505、ORA-27037错误

源库:RHEL 7.9ORACLE 19.19.0.0.0 $ cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 16 14:17:38 2023 Version 19.19.0.0.0Copyright (c) 1982, 2022,…

winform+access超市管理信息系统

说明文档 主要技术: 基于C#winform架构和access数据库 功能模块: 登陆和对access数据库的一些简单操作,只适合新手学习看看 运行环境: 运行需vs2013或者以上版本,sql server 2012或者以上版本。附送有运行说明文档。…