zoukankan      html  css  js  c++  java
  • 在O(1)时间删除链表节点

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

        struct ListNode{

        int  m_nValue; ListNode*  m_pNext;

     }

       void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);

       解析:既然已经给定了要删除节点的指针,可以将删除节点的下一个节点的内容复制到要删除的节点,覆盖原有的内容,并将要删除节点的指针指向下一个节点的下一个节点,再将下一个节点删除。这期间要考虑两种特殊的情况:1、要删除的节点是最后一个节点,需要遍历链表找到删除节点的前序节点,并完成删除操作;2、如果当前链表中只有一个节点,要将链表的头结点置NULL。

     1 struct ListNode{
     2     int m_nValue;
     3     ListNode* m_pNext;
     4 };
     5 
     6 void DeleteNode(ListNode** pListNode,ListNode* pToBeDeleted){
     7     if(!pListNode||!pToBeDeleted)
     8         return ;
     9     //正常情况
    10     if(pToBeDeleted->m_pNext!=NULL){
    11          pToBeDeleted->m_nValue = pToBeDeleted->m_pNext->m_nValue;
    12          pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext;
    13          delete pToBeDeleted->m_pNext;
    14          pToBeDeleted->m_pNext = NULL;
    15     }
    16     //链表中只有一个节点
    17     else if(*pListNode == pToBeDeleted){
    18         delete pToBeDeleted;
    19         pToBeDeleted = NULL;
    20         *pListNode = NULL;
    21     }
    22     //链表中有多个节点,删除尾节点
    23     else{
    24         ListNode *pNode = *pListNode;
    25         while(pNode->m_pNext!=pToBeDeleted){
    26             pNode = pNode->m_pNext;
    27         }
    28         pNode->m_pNext = NULL;
    29         delete pToBeDeleted;
    30         pToBeDeleted = NULL;
    31     }
    32 }
  • 相关阅读:
    JS 一键复制功能实现
    移动端点击弹窗后禁止页面滑动
    ui库地址总结
    react源码解析20.总结&第一章的面试题解答
    react源码解析19.手写迷你版react
    react源码解析18事件系统
    react源码解析17.context
    react源码解析16.concurrent模式
    react源码解析15.scheduler&Lane
    react源码解析14.手写hooks
  • 原文地址:https://www.cnblogs.com/yangrenzhi/p/5780138.html
Copyright © 2011-2022 走看看