剑指offer之 O(1)时间删除链表结点
问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
- public class Test13 {
- /**
- * 链表结点
- */
- public static class ListNode {
- int value; // 保存链表的值
- ListNode next; // 下一个结点
- }
- /**
- * 给定单向链表的头指针和一个结点指针,定义一个函数在0(1)时间删除该结点,
- * 【注意1:这个方法和文本上的不一样,书上的没有返回值,这个因为JAVA引用传递的原因,
- * 如果删除的结点是头结点,如果不采用返回值的方式,那么头结点永远删除不了】
- * 【注意2:输入的待删除结点必须是待链表中的结点,否则会引起错误,这个条件由用户进行保证】
- *
- * @param head 链表表的头
- * @param toBeDeleted 待删除的结点
- * @return 删除后的头结点
- */
- public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
- // 如果输入参数有空值就返回表头结点
- if (head == null || toBeDeleted == null) {
- return head;
- }
- // 如果删除的是头结点,直接返回头结点的下一个结点
- if (head == toBeDeleted) {
- return head.next;
- }
- // 下面的情况链表至少有两个结点
- // 在多个节点的情况下,如果删除的是最后一个元素
- if (toBeDeleted.next == null) {
- // 找待删除元素的前驱
- ListNode tmp = head;
- while (tmp.next != toBeDeleted) {
- tmp = tmp.next;
- }
- // 删除待结点
- tmp.next = null;
- }
- // 在多个节点的情况下,如果删除的是某个中间结点
- else {
- // 将下一个结点的值输入当前待删除的结点
- toBeDeleted.value = toBeDeleted.next.value;
- // 待删除的结点的下一个指向原先待删除引号的下下个结点,即将待删除的下一个结点删除
- toBeDeleted.next = toBeDeleted.next.next;
- }
- // 返回删除节点后的链表头结点
- return head;
- }
- /**
- * 输出链表的元素值
- *
- * @param head 链表的头结点
- */
- public static void printList(ListNode head) {
- while (head != null) {
- System.out.print(head.value + "->");
- head = head.next;
- }
- System.out.println("null");
- }
- public static void main(String[] args) {
- ListNode head = new ListNode();
- head.value = 1;
- head.next = new ListNode();
- head.next.value = 2;
- head.next.next = new ListNode();
- head.next.next.value = 3;
- head.next.next.next = new ListNode();
- head.next.next.next.value = 4;
- ListNode middle = head.next.next.next.next = new ListNode();
- head.next.next.next.next.value = 5;
- head.next.next.next.next.next = new ListNode();
- head.next.next.next.next.next.value = 6;
- head.next.next.next.next.next.next = new ListNode();
- head.next.next.next.next.next.next.value = 7;
- head.next.next.next.next.next.next.next = new ListNode();
- head.next.next.next.next.next.next.next.value = 8;
- ListNode last = head.next.next.next.next.next.next.next.next = new ListNode();
- head.next.next.next.next.next.next.next.next.value = 9;
- head = deleteNode(head, null); // 删除的结点为空
- printList(head);
- ListNode node = new ListNode();
- node.value = 12;
- head = deleteNode(head, head); // 删除头结点
- printList(head);
- head = deleteNode(head, last); // 删除尾结点
- printList(head);
- head = deleteNode(head, middle); // 删除中间结点
- printList(head);
- head = deleteNode(head, node); // 删除的结点不在链表中
- printList(head);
- }
- }
剑指offer之 O(1)时间删除链表结点的更多相关文章
- [剑指offer]Q13:O(1)时间删除链表的结点
通常我们所说的删除链表的某个结点,是彻底删除该结点的空间.而要这么做就必须知道其前驱结点.这里的想法是,链表中存储的val是同类型的,仅仅要将该结点的val内容删除就能够了. 那么就能够用该结点的后继 ...
- 剑指offer.在O(1)时间内删除链表节点
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点.假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节 ...
- 【校招面试 之 剑指offer】第18题 删除链表中的节点
题目一:在O(1)时间内删除链表节点. 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. 思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然 ...
- 剑指offer13 在O(1)时间删除链表的结点
把下一个节点的值直接赋值给要删除的节点,然后删除下一个节点.当这样做会有两个bad case:被删除的链表结点的下一个结点为空指针,如果链表只有一个结点.其实链表只有一个结点应该属于下一个结点为空指针 ...
- 【剑指offer】面试题 18. 删除链表的节点
面试题 18. 删除链表的节点
- [剑指Offer]18-题目一:删除链表的节点 题目二:删除链表中重复节点
题目一 题目 O(1)时间复杂度删除给定链表节点. 题解 用待删除节点后一个节点的值覆盖待删除节点值,更新链接关系. 注意链表只有一个节点:删除尾结点:删除头节点的处理. 代码 class ListN ...
- [刷题] 剑指offer 面试题18:删除链表节点
要求 给定单向链表的头指针和一个节点指针,在O(1)时间内删除该节点 常规思路:从头节点a开始顺序遍历,发现p指向要删除的节点i,然后把p的m_pNext指向i的下一个节点j,时间复杂度O(n) O( ...
- 剑指Offer11 在O(1)内删除链表结点
/************************************************************************* > File Name: 11_Delete ...
- 剑指offer五十六之删除链表中重复的结点
一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
随机推荐
- nginx实现某个页面http访问,其余全部跳转到https
全站https实现某个页面可以http访问,其余全部跳转到https,注意下面的location,如果不加root 配置 找不到这个文件的server { listen ; server_name w ...
- 让 webpack 加载 Source Map
在浏览器中运行的 JavaScript 代码都是编译器输出的代码,这些代码的可读性很差.如果在开发过程中遇到一个不知道原因的 Bug,则你可能需要通过断点调试去找出问题. 在编译器输出的代码上进行断点 ...
- SpringBoot集成actuator模块的基本使用
© 版权声明:本文为博主原创文章,转载请注明出处 1. 版本 SpringBoot:2.0.0.RELEASE 2. 集成 SpringBoot集成actuator模块非常简单,只需要引入actuat ...
- vivado2013.4和modelsim联合仿真
vivado2013.4和modelsim联合仿真 Hello,Panda 最近在做Zynq的项目,曾经尝试使用ISE+PlanAhe ...
- MQTT服务器搭建--Apollo
尊重原创,我是伸手党:https://blog.csdn.net/u012377333/article/details/68943416 1.Apollo下载 下载地址:http://activemq ...
- NHibernate二级缓存(第十一篇)
NHibernate二级缓存(第十一篇) 一.NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享. 注意NHibernate查 ...
- web安全之SQL注入--第一章 课程介绍
课程介绍1.什么是SQL注入?2.如何寻找SQL注入漏洞?3.如何进行sql注入攻击?4.如何预防sql注入5.课程总结
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- ibatis中井号跟美元符号区别(#.$)
1.#可以进行预编译,进行类型匹配,#变量名# 会转化为 jdbc 的 类型 $不进行数据类型匹配,$变量名$就直接把 $name$替换为 name的内容 例如: select * from tabl ...
- Jeecms 防xss处理原理
Web.xml配置过滤器,并指的要过滤和替换的字符: 过滤器的filter方法,对传入的HttpServletRequest对象进行了修改 具体过滤在XssHttpServletRequestWrap ...