剑指offer面试题13 在O(1)时间删除链表结点

考察点

链表

知识点

链表的删除正常情况下需要O(n)的时间,因为需要找到待删除结点的前置结点

题目

分析
我们都知道链表删除往往需要O(n)遍历链表,找到待删除结点的前置结点,把前置结点的next指针指向待删除结点的后置结点。现在要求O(1)时间删除,那肯定不能用遍历的办法了,试想一下一个结点包括一个值和指向下一个结点的指针,如果把待删除结点的后置结点的值复制到待删除结点这里,然后删除掉待删除结点的后置结点其实就相当于把待删除结点删除掉了。其中有俩个特殊场景需要注意:如果待删除的结点是尾结点则只能按照遍历的方式删除,如果待删除的结点是头结点则在删除的时候也需要把头结点置空

public class LinkNode {int val;LinkNode next;public LinkNode(int data) {this.val = data;this.next = null;}
}
import java.util.Deque;
import java.util.LinkedList;public class LinkList {LinkNode head;public LinkList() {this.head = null;}public LinkNode getNode(int cnt) {if (this.head == null) {return null;}LinkNode cur = this.head;while(cur != null && cnt > 1) {cur = cur.next;cnt --;}return cur;}//o(1)方式删除元素public void deleteLinkNode(LinkNode pDelete) {if (this.head == null || pDelete == null) {return;}//只有一个头结点if (this.head.next == null && this.head == pDelete) {this.head = null;pDelete = null;return;}//删除的是尾结点if (pDelete.next == null) {LinkNode cur = this.head;while (cur.next != pDelete) {cur = cur.next;}cur.next = null;pDelete = null;return;}LinkNode tmp = pDelete.next;pDelete.val = tmp.val;pDelete.next = tmp.next;tmp = null;}//添加元素public void addNode(int data) {LinkNode node = new LinkNode(data);if (this.head == null) {this.head = node;} else {LinkNode cur = this.head;while(cur.next != null) {cur = cur.next;}cur.next = node;}}//正序打印public void print() {LinkNode node = this.head;while(node != null) {System.out.print(node.val);System.out.print(" ");node = node.next;}System.out.println();}//倒序打印public void reversePrint() {Deque<Integer> stack = new LinkedList<>();LinkNode cur = this.head;while(cur != null) {stack.push(cur.val);cur = cur.next;}while(stack.size() > 0) {System.out.print(stack.peek());System.out.print(" ");stack.pop();}System.out.println();}//删除元素public void deleteNode(int data) {if (this.head != null) {LinkNode pDelete = null;if (this.head.val == data) {pDelete = this.head;this.head = this.head.next;} else {LinkNode cur = this.head;while(cur.next != null && cur.next.val != data) {cur = cur.next;}if (cur.next != null && cur.next.val == data) {pDelete = cur.next;cur.next = cur.next.next;}}if (pDelete != null) {pDelete = null;}}}
}
public class Thirteen {public static void main(String[] args) {LinkList linkList = new LinkList();linkList.addNode(1);linkList.addNode(2);linkList.addNode(3);linkList.addNode(4);linkList.addNode(5);linkList.print();LinkNode p = linkList.getNode(2);if (p != null) {linkList.deleteLinkNode(p);linkList.print();}LinkNode tailNode = linkList.getNode(4);if (tailNode != null) {linkList.deleteLinkNode(tailNode);linkList.print();}LinkNode headNode = linkList.getNode(1);if (headNode != null) {linkList.deleteLinkNode(headNode);linkList.print();}p = linkList.getNode(2);if (p != null) {linkList.deleteLinkNode(p);linkList.print();}LinkNode singleHeadNode= linkList.getNode(1);if (singleHeadNode != null) {linkList.deleteLinkNode(singleHeadNode);linkList.print();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式-结构型模式

1.代理模式 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。…

复杂链表的复制

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

在Ubuntu Linux上安装Chrome浏览器的最佳方法

我们可以使用GUI和命令行方法在Ubuntu Linux上安装Google Chrome浏览器&#xff0c;但是&#xff0c;终端是配置Chrome浏览器的最佳方式。在这里&#xff0c;我们讨论如何使用它。 有数十种浏览器&#xff0c;甚至Linux系统如Ubuntu也带有自己的默认浏览器Mozilla Firefox。然…

电磁波的波长与频率是什么关系?

摘要: 电磁波的波长&#xff08;λ&#xff09;与频率&#xff08;f&#xff09;之间的关系可以通过以下公式来表示&#xff1a; f c/λ cλf 其中&#xff1a; c 是光速&#xff0c;即电磁波在真空中的传播速度&#xff0c;约为 3 x 10⁸ 米/秒&#xff08;m/s&#xff09;λ…

2024.1.26每日一题

LeetCode 边权重均等查询 2846. 边权重均等查询 - 力扣&#xff08;LeetCode&#xff09; 题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi,…

三方jar包引入到springboot中 package到jar中正常启动的pom文件怎么写 IDEA

文章目录 场景例子工程引用pom文件&#xff08;打包关键&#xff09;打包后观察 场景 许多时候我们在对接三方的时候&#xff0c;需要下载官方的推荐的SDK&#xff0c;但springboot项目怎么引入额外的三方jar包了&#xff0c;自已通过maven本地坐标的方式尝也不行&#xff0c;…

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展&#xff0c;全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

商业标书制作的艺术与科学

在商业世界中&#xff0c;标书不仅是一份文件&#xff0c;它是企业实力和专业精神的体现&#xff0c;是通往成功竞标的敲门砖。制作一份出色的商业标书&#xff0c;就像是在精心策划一场演出&#xff0c;每一个细节都至关重要。今天&#xff0c;就让我们一起探索商业标书制作流…

数据库系统原理总结之——目录

数据库系统原理总结之——目录 资料说明&#xff1a;主要是对数据库系统原理总结&#xff0c;发布的各个章节总结一个目录方便查看和查找 第一章数据库系统概述 第二章 关系数据库 第三章 数据库设计 第四章 SQL 与关系数据库基本操作 第五章 数据库编程 第六章 数据库安…

PageHelper分页插件-以三层架构模型开发为例

文章目录 1、简介2、使用2.1、导入2.1.1、SpringBoot2.1.2、非SpringBoot 2.2、controller2.3、service2.4、mapper ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、…

智能小程序事件系统——基础交互事件介绍

什么是交互事件 事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上。当达到触发事件&#xff0c;就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息&#xff0c;如 id、dataset 和 touches。 事件分类 事件分为…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

25从零开始用Rust编写nginx,序列化之serde是如何工作的

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器&#xff0c;四层TCP/UDP转发&#xff0c;内网穿透&#xff0c;后续将实现websocket代理等&#xff0c;会将实现过程分享出来&#xff0c;感兴趣的可以一起造个轮子 项目地址 国内: https:…

SQL字符串截取函数【简笔记】

MySQL提供了多种字符串函数来处理和截取字符串。下面是一些常用的字符串截取函数及其使用示范&#xff1a; SUBSTRING(str, pos, len) str 是要截取的字符串。pos 是开始截取的位置。len 是截取的长度。 示例: SELECT SUBSTRING(Hello, World!, 8, 5); -- 结果: "World…

实验一:FIRST集

前置知识 1.vector基本操作https://c.biancheng.net/view/6749.html2.set基本操作https://c.biancheng.net/view/7196.html 核心操作 //G文法结构体 struct G {int Vt_number;int Vn_number;int P_number;set<char> Vt;set<char> Vn;char S;vector<string>…

ConcurrentHashMap详解

ConcurrentHashMap详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;在今天的文章中&#xff0c;我们将深入探讨Java中的一个重要类——ConcurrentHashMap。这是一个在多线程环境下高效操作的线程安全的哈希表&#xff0c;让我们…

ERD Online:数据建模与元数据管理的未来

ERD Online&#xff1a;数据建模与元数据管理的未来&#x1f31f; 在数字化时代&#xff0c;数据是企业的核心资产。如何高效、安全地管理这些数据成为企业面临的一大挑战。今天&#xff0c;我要介绍的这个平台&#xff0c;可能是你正在寻找的解决方案——它就是 ERD Online&am…

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

怎么创建facebook广告

创建Facebook广告的文章应由本人根据自身实际情况书写&#xff0c;以下仅供参考&#xff0c;请您根据自身实际情况撰写。 创建Facebook广告的步骤&#xff1a; 确定目标受众和广告主题&#xff1a;首先需要明确你的目标受众是谁&#xff0c;他们有什么特点&#xff0c;以及你想…

蓝桥杯2024/1/28----十二届省赛题笔记

题目要求&#xff1a; 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 &#xff1a; 选手需严格按照以上要求配置竞赛板&#xff0c;编写和调…