1. #include <iostream>
  2. using namespace std;
  3.  
  4. //构造链表结点
  5. struct ListNode
  6. {
  7. int val;
  8. ListNode *next;
  9.  
  10. ListNode(int v = ):val(v), next(NULL){};
  11. };
  12.  
  13. //打印结点
  14. void printList(ListNode *head)
  15. {
  16. while(head != NULL)
  17. {
  18. cout<<head->val<<" ";
  19. head = head->next;
  20. }
  21. cout<<endl;
  22. }
  23.  
  24. //删除结点
  25. void deleteListNode(ListNode **head, ListNode *tobeDeleted)
  26. {
  27. //头结点或者待删除结点为空,则结束调用
  28. if(*head == NULL || tobeDeleted == NULL)
  29. return ;
  30.  
  31. //待删除结点的pnext非空,则复制其值到待删除结点,删除pnext
  32. if(tobeDeleted->next != NULL)
  33. {
  34. ListNode *pnext = tobeDeleted->next;
  35.  
  36. tobeDeleted->val = pnext->val;
  37. tobeDeleted->next = pnext->next;
  38.  
  39. delete pnext;
  40. pnext = NULL;
  41. }
  42. //若只剩头结点,则删除头结点
  43. else if(tobeDeleted == *head)
  44. {
  45. delete tobeDeleted;
  46.  
  47. tobeDeleted = NULL;
  48. *head = NULL;
  49. }
  50. //若待删除结点为尾结点,则顺序查找后删除
  51. else
  52. {
  53. ListNode *phead = *head;
  54.  
  55. while(phead->next != tobeDeleted)
  56. {
  57. phead = phead->next;
  58. }
  59.  
  60. phead->next = NULL;
  61. delete tobeDeleted;
  62. tobeDeleted = NULL;
  63. }
  64. }
  65.  
  66. int main()
  67. {
  68. ListNode *ls = new ListNode();
  69. ListNode *head = ls;
  70.  
  71. ListNode *l1 = new ListNode();
  72. ls->next = l1;
  73. ls = ls->next;
  74.  
  75. ListNode *l2 = new ListNode();
  76. ls->next = l2;
  77. ls = ls->next;
  78.  
  79. ListNode *l3 = new ListNode();
  80. ls->next = l3;
  81. ls = ls->next;
  82.  
  83. ListNode *l4 = new ListNode();
  84. ls->next = l4;
  85. ls = ls->next;
  86.  
  87. cout<<"初始链表 -> ";
  88. printList(head);
  89. cout<<endl;
  90.  
  91. cout<<"删除中间结点2后 -> ";
  92. deleteListNode(&head,l2);
  93. printList(head);
  94. cout<<endl;
  95.  
  96. cout<<"删除尾结点4后 -> ";
  97. deleteListNode(&head,l4);
  98. printList(head);
  99. cout<<endl;
  100.  
  101. cout<<"删除中间结点1后 -> ";
  102. deleteListNode(&head,l1);
  103. printList(head);
  104. cout<<endl;
  105.  
  106. cout<<"删除尾结点3后 -> ";
  107. deleteListNode(&head,l1);
  108. printList(head);
  109. cout<<endl;
  110.  
  111. cout<<"删除头结点后 -> ";
  112. deleteListNode(&head,head);
  113. printList(head);
  114. cout<<endl;
  115. }

测试结果:

  1. 初始链表 ->
  2.  
  3. 删除中间结点2 ->
  4.  
  5. 删除尾结点4 ->
  6.  
  7. 删除中间结点1 ->
  8.  
  9. 删除尾结点3 ->
  10.  
  11. 删除头结点后 ->

【剑指offer 面试题13】在 O(1) 时间删除链表结点的更多相关文章

  1. 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...

  2. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

  3. C++版 - 剑指offer 面试题5:从尾到头打印链表 题解

    面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tq ...

  4. 剑指Offer面试题15(Java版):链表中倒数第K个结点

    题目: 输入一个链表.输出该链表中倒数第k哥结点.  为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...

  5. (剑指Offer)面试题13:在O(1)时间内删除链表结点

    题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; } ...

  6. 《剑指offer》面试题13 在O(1)时间删除链表节点 Java版

    这道题的关键是知道找到尾节点的前一个节点必须遍历,而且这样做了之后总的时间复杂度还是O(1),以及如何不破坏链表删除一个已知节点 public ListNode delete(ListNode hea ...

  7. 剑指Offer面试题:4.从尾到头打印链表

    一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结 ...

  8. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  9. 剑指offer-面试题13.在O(1)时间删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...

随机推荐

  1. Java中LinkedList的remove方法真的耗时O(1)吗?

    这个问题其实来源于Leetcode的一道题目,也就是上一篇日志 LRU Cache.在使用LinkedList超时后,换成ArrayList居然AC了,而问题居然是在于List.remove(Obje ...

  2. java.lang.NoClassDefFoundError: JspException

    在打开jsp页面的时候报错java.lang.NoClassDefFoundError: JspException,如下所示: 原因和解决方案: 原因是由于包不全 把该导的包导进去,在上面的例子就是由 ...

  3. spring 与 CXF 整合 webservice 出现error “Unable to locate Spring NamespaceHandler for XML schema namespace” 总结

    我试了多个版本的spring 发现 出现error : Unable to locate Spring NamespaceHandler for XML schema namespace 并非都是sp ...

  4. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  5. HTML5+开发移动app教程3-mui开发示例

    下面就开始一个简答的例子,以及mui相关内容 mui 官网:http://dcloudio.github.io/mui/ 说明:http://dev.dcloud.net.cn/mui/ui/inde ...

  6. iOS 精确定时器

    Do I need a high precision timer? Don't use a high precision timer unless you really need it. They c ...

  7. MySQL登录报错"Access denied for user 'root'@'localhost' (using password: YES)"

    最近登录MySQL时候总报错: # mysql -uroot -p Enter password: ERROR (): Access denied for user 'root'@'localhost ...

  8. CMake with Win&MinGW

    今天一个下午都在做一件简直耻辱play的事情,论文没看,程序没写,玩了一个下午的编译器...心塞(逃... 言归正传,今天要讲在windows下,使用Cmake和MInGW. 1.g++ MinGW的 ...

  9. Objective-c CoreData

    #import "AppDelegate.h" #import "Person.h" @implementation AppDelegate @synthesi ...

  10. GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态

    1.命名空间:using System.Runtime.InteropServices;2.导入方法[DllImport("user32.dll", EntryPoint = &q ...