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

链表结点与函数的定义如下:

  1. struct ListNode
  2. {
  3. int m_nValue;
  4. ListNode* m_pNext;
  5. };
  6.  
  7. void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);

思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除。就相当于把当前需要删除的结点给删除了。

实现代码如下:

  1. #include<iostream>
  2. #include<stdlib.h>
  3. using namespace std;
  4.  
  5. //链表结构
  6. struct ListNode
  7. {
  8. int m_nValue;
  9. ListNode* m_pNext;
  10. };
  11.  
  12. //创建一个链表结点
  13. ListNode* CreateListNode(int value)
  14. {
  15. ListNode *pNode = new ListNode();
  16. pNode->m_nValue=value;
  17. pNode->m_pNext=NULL;
  18. return pNode;
  19.  
  20. }
  21.  
  22. //遍历链表中所有结点
  23. void PrintList(ListNode* pHead)
  24. {
  25. ListNode *pNode = pHead;
  26. while(pNode!=NULL)
  27. {
  28. cout<<pNode->m_nValue<<" ";
  29. pNode=pNode->m_pNext;
  30. }
  31. cout<<endl;
  32. }
  33. //连接两个结点
  34. void ConnectListNode(ListNode *pCurrent,ListNode* pNext)
  35. {
  36. if(pCurrent==NULL)
  37. {
  38. cout<<"前一个结点不能为空"<<endl;
  39. exit();
  40. }
  41. else
  42. {
  43. pCurrent->m_pNext=pNext;
  44. }
  45. }
  46.  
  47. //删除链表
  48. void DestroyList(ListNode* pHead)
  49. {
  50. ListNode* pNode = pHead;
  51. while(pNode != NULL)
  52. {
  53. pHead = pHead->m_pNext;
  54. delete pNode;
  55. pNode = pHead;
  56. }
  57. }
  58.  
  59. //考虑四种不同的情况
  60. void DeleteNode(ListNode** pListHead, ListNode* pTobeDeleted)
  61. {
  62. if(!pListHead || !pTobeDeleted)
  63. return;
  64.  
  65. //要删除的结点不是尾结点
  66. if(pTobeDeleted->m_pNext != NULL)
  67. {
  68. ListNode* pNext = pTobeDeleted->m_pNext;
  69. pTobeDeleted->m_nValue = pNext->m_nValue;
  70. pTobeDeleted->m_pNext = pNext->m_pNext;
  71.  
  72. delete pNext;
  73. pNext = NULL;
  74. }
  75. //链表只有一个结点,删除头结点(也是尾结点)
  76. else if(*pListHead == pTobeDeleted)
  77. {
  78. delete pTobeDeleted;
  79. pTobeDeleted = NULL;
  80. *pListHead = NULL;
  81. }
  82. //链表中有多个结点,删除尾结点 ,只能遍历链表
  83. else
  84. {
  85. ListNode* pNode = *pListHead;
  86. while(pNode->m_pNext != pTobeDeleted)
  87. {
  88. pNode = pNode->m_pNext;
  89. }
  90.  
  91. pNode->m_pNext = NULL;
  92. delete pTobeDeleted;
  93. pTobeDeleted = NULL;
  94. }
  95. }
  96.  
  97. int main()
  98. {
  99. //创建结点
  100. ListNode* pNode1 = CreateListNode();
  101. ListNode* pNode2 = CreateListNode();
  102. ListNode* pNode3 = CreateListNode();
  103. ListNode* pNode4 = CreateListNode();
  104. ListNode* pNode5 = CreateListNode();
  105. ListNode* pNode6 = CreateListNode();
  106. ListNode* pNode7 = CreateListNode();
  107. //连接结点
  108. ConnectListNode(pNode1,pNode2);
  109. ConnectListNode(pNode2,pNode3);
  110. ConnectListNode(pNode3,pNode4);
  111. ConnectListNode(pNode4,pNode5);
  112. ConnectListNode(pNode5,pNode6);
  113. ConnectListNode(pNode6,pNode7);
  114.  
  115. PrintList(pNode1);
  116. //删除结点
  117. DeleteNode(&pNode1,pNode4);
  118. //打印链表
  119. PrintList(pNode1);
  120. //删除链表
  121. DestroyList(pNode1);
  122.  
  123. return ;
  124. }

运行结果如下:

在O(1)时间删除链表结点的更多相关文章

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

    一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...

  2. 【面试题013】在O(1)时间删除链表结点

    [面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...

  3. 【Java】 剑指offer(17) 在O(1)时间删除链表结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除 ...

  4. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  5. 面试题18(一):在O(1)时间删除链表结点

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct Lis ...

  6. 第18题:在O(1)时间删除链表结点+删除链表中重复的节点

    题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...

  7. 33.在O(1)时间删除链表结点[DeleteListNode]

    [题目] 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下:  C++ Code  123456   struct ListNode {     int        m_ ...

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

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

  9. P99、面试题13:在o(1)时间删除链表结点

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

随机推荐

  1. hdu 5279 Reflect phi 欧拉函数

    Reflect Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_chi ...

  2. ApiDemo/FragmentRetainInstance 解析

    /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  3. delphi 带历史信息的菜单

    带历史信息的菜单 实例说明 在有些软件中,菜单栏中可以记录已经打开过的文件信息,使用户操作简单.快捷.当用户要打开已打开过的文件时,不需要重复查找,只需选择菜单中打开过的文件,即可实现打开该文件的操作 ...

  4. cocos2d-x如何优化内存的应用

    自身以前也写过cocos2d-x如何优化内存的应用,以及内存不够的情况下怎么样处置惩罚游戏.今天在微博中看到有友好简介了下内存,挺详细的.不晓得是谁写的,我纪录下. 一,IOS与图片内存 在IOS上, ...

  5. android service总结

    1.通过startservice方法启动一个服务.service不能自己启动自己.若在一个服务中启动一个activity则,必须是申明一个全新的activity任务TASK.通过startservic ...

  6. PHP实现Web Service(转)

    1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码)  2.SCA 服务组件 ...

  7. Error creating bean with name &#39;menuController&#39;: Injection of autowired dependency……

    出现了一大串错误 Error creating bean with name 'userController': Injection of autowired dependencies failed. ...

  8. 网络IPC:套接字之带外数据

    带外数据(Out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输.即使传输队列已经有数据,带外数据先行传输.TCP支持带外数据,但是UDP不支持.套接 ...

  9. LeetCode: Populating Next Right Pointer in Each Node

    LeetCode: Populating Next Right Pointer in Each Node Given a binary tree struct TreeLinkNode { TreeL ...

  10. strassen algorithm

    the explaination that is clear in my view is from wiki.