问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

  1. public class Test13 {
  2. /**
  3. * 链表结点
  4. */
  5. public static class ListNode {
  6. int value; // 保存链表的值
  7. ListNode next; // 下一个结点
  8. }
  9. /**
  10. * 给定单向链表的头指针和一个结点指针,定义一个函数在0(1)时间删除该结点,
  11. * 【注意1:这个方法和文本上的不一样,书上的没有返回值,这个因为JAVA引用传递的原因,
  12. * 如果删除的结点是头结点,如果不采用返回值的方式,那么头结点永远删除不了】
  13. * 【注意2:输入的待删除结点必须是待链表中的结点,否则会引起错误,这个条件由用户进行保证】
  14. *
  15. * @param head 链表表的头
  16. * @param toBeDeleted 待删除的结点
  17. * @return 删除后的头结点
  18. */
  19. public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
  20. // 如果输入参数有空值就返回表头结点
  21. if (head == null || toBeDeleted == null) {
  22. return head;
  23. }
  24. // 如果删除的是头结点,直接返回头结点的下一个结点
  25. if (head == toBeDeleted) {
  26. return head.next;
  27. }
  28. // 下面的情况链表至少有两个结点
  29. // 在多个节点的情况下,如果删除的是最后一个元素
  30. if (toBeDeleted.next == null) {
  31. // 找待删除元素的前驱
  32. ListNode tmp = head;
  33. while (tmp.next != toBeDeleted) {
  34. tmp = tmp.next;
  35. }
  36. // 删除待结点
  37. tmp.next = null;
  38. }
  39. // 在多个节点的情况下,如果删除的是某个中间结点
  40. else {
  41. // 将下一个结点的值输入当前待删除的结点
  42. toBeDeleted.value = toBeDeleted.next.value;
  43. // 待删除的结点的下一个指向原先待删除引号的下下个结点,即将待删除的下一个结点删除
  44. toBeDeleted.next = toBeDeleted.next.next;
  45. }
  46. // 返回删除节点后的链表头结点
  47. return head;
  48. }
  49. /**
  50. * 输出链表的元素值
  51. *
  52. * @param head 链表的头结点
  53. */
  54. public static void printList(ListNode head) {
  55. while (head != null) {
  56. System.out.print(head.value + "->");
  57. head = head.next;
  58. }
  59. System.out.println("null");
  60. }
  61. public static void main(String[] args) {
  62. ListNode head = new ListNode();
  63. head.value = 1;
  64. head.next = new ListNode();
  65. head.next.value = 2;
  66. head.next.next = new ListNode();
  67. head.next.next.value = 3;
  68. head.next.next.next = new ListNode();
  69. head.next.next.next.value = 4;
  70. ListNode middle = head.next.next.next.next = new ListNode();
  71. head.next.next.next.next.value = 5;
  72. head.next.next.next.next.next = new ListNode();
  73. head.next.next.next.next.next.value = 6;
  74. head.next.next.next.next.next.next = new ListNode();
  75. head.next.next.next.next.next.next.value = 7;
  76. head.next.next.next.next.next.next.next = new ListNode();
  77. head.next.next.next.next.next.next.next.value = 8;
  78. ListNode last = head.next.next.next.next.next.next.next.next = new ListNode();
  79. head.next.next.next.next.next.next.next.next.value = 9;
  80. head = deleteNode(head, null); // 删除的结点为空
  81. printList(head);
  82. ListNode node = new ListNode();
  83. node.value = 12;
  84. head = deleteNode(head, head); // 删除头结点
  85. printList(head);
  86. head = deleteNode(head, last); // 删除尾结点
  87. printList(head);
  88. head = deleteNode(head, middle); // 删除中间结点
  89. printList(head);
  90. head = deleteNode(head, node); // 删除的结点不在链表中
  91. printList(head);
  92. }
  93. }

剑指offer之 O(1)时间删除链表结点的更多相关文章

  1. [剑指offer]Q13:O(1)时间删除链表的结点

    通常我们所说的删除链表的某个结点,是彻底删除该结点的空间.而要这么做就必须知道其前驱结点.这里的想法是,链表中存储的val是同类型的,仅仅要将该结点的val内容删除就能够了. 那么就能够用该结点的后继 ...

  2. 剑指offer.在O(1)时间内删除链表节点

    给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点.假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节 ...

  3. 【校招面试 之 剑指offer】第18题 删除链表中的节点

    题目一:在O(1)时间内删除链表节点. 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. 思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然 ...

  4. 剑指offer13 在O(1)时间删除链表的结点

    把下一个节点的值直接赋值给要删除的节点,然后删除下一个节点.当这样做会有两个bad case:被删除的链表结点的下一个结点为空指针,如果链表只有一个结点.其实链表只有一个结点应该属于下一个结点为空指针 ...

  5. 【剑指offer】面试题 18. 删除链表的节点

    面试题 18. 删除链表的节点

  6. [剑指Offer]18-题目一:删除链表的节点 题目二:删除链表中重复节点

    题目一 题目 O(1)时间复杂度删除给定链表节点. 题解 用待删除节点后一个节点的值覆盖待删除节点值,更新链接关系. 注意链表只有一个节点:删除尾结点:删除头节点的处理. 代码 class ListN ...

  7. [刷题] 剑指offer 面试题18:删除链表节点

    要求 给定单向链表的头指针和一个节点指针,在O(1)时间内删除该节点 常规思路:从头节点a开始顺序遍历,发现p指向要删除的节点i,然后把p的m_pNext指向i的下一个节点j,时间复杂度O(n) O( ...

  8. 剑指Offer11 在O(1)内删除链表结点

    /************************************************************************* > File Name: 11_Delete ...

  9. 剑指offer五十六之删除链表中重复的结点

    一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

随机推荐

  1. nginx实现某个页面http访问,其余全部跳转到https

    全站https实现某个页面可以http访问,其余全部跳转到https,注意下面的location,如果不加root 配置 找不到这个文件的server { listen ; server_name w ...

  2. 让 webpack 加载 Source Map

    在浏览器中运行的 JavaScript 代码都是编译器输出的代码,这些代码的可读性很差.如果在开发过程中遇到一个不知道原因的 Bug,则你可能需要通过断点调试去找出问题. 在编译器输出的代码上进行断点 ...

  3. SpringBoot集成actuator模块的基本使用

    © 版权声明:本文为博主原创文章,转载请注明出处 1. 版本 SpringBoot:2.0.0.RELEASE 2. 集成 SpringBoot集成actuator模块非常简单,只需要引入actuat ...

  4. vivado2013.4和modelsim联合仿真

    vivado2013.4和modelsim联合仿真                           Hello,Panda        最近在做Zynq的项目,曾经尝试使用ISE+PlanAhe ...

  5. MQTT服务器搭建--Apollo

    尊重原创,我是伸手党:https://blog.csdn.net/u012377333/article/details/68943416 1.Apollo下载 下载地址:http://activemq ...

  6. NHibernate二级缓存(第十一篇)

    NHibernate二级缓存(第十一篇) 一.NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享. 注意NHibernate查 ...

  7. web安全之SQL注入--第一章 课程介绍

    课程介绍1.什么是SQL注入?2.如何寻找SQL注入漏洞?3.如何进行sql注入攻击?4.如何预防sql注入5.课程总结

  8. 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治

    [BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...

  9. ibatis中井号跟美元符号区别(#.$)

    1.#可以进行预编译,进行类型匹配,#变量名# 会转化为 jdbc 的 类型 $不进行数据类型匹配,$变量名$就直接把 $name$替换为 name的内容 例如: select * from tabl ...

  10. Jeecms 防xss处理原理

    Web.xml配置过滤器,并指的要过滤和替换的字符: 过滤器的filter方法,对传入的HttpServletRequest对象进行了修改 具体过滤在XssHttpServletRequestWrap ...