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

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

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

    前提:默认输入的待删除节点在链表中!

    链表结点结构定义如下:

    1 struct ListNode
    2 {
    3     int m_nValue;
    4     ListNode* m_pNext;
    5 };

    思路:若待删结点的下一结点非空,则把它的值复制给待删节点,然后释放待删结点的下一结点;

        若待删结点的下一结点为空且等于待删结点等于头结点,则释放之;

        若上面两种情况都不是,即为尾结点,需要从头遍历而后删除;平均时间复杂度[(n-1)*O(1)+O(n)]/n = O(1)


    code:

     1 void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
     2 {
     3     if (!pListHead || !pToBeDeleted)
     4     {
     5         return;
     6     }
     7     if (pToBeDeleted->m_pNext != NULL)
     8     {
     9         ListNode* pNext = pToBeDeleted->m_pNext;
    10         pToBeDeleted->m_pNext = pNext->m_pNext;
    11         pToBeDeleted->m_nValue = pNext->m_nValue;
    12         free(pNext);
    13         pNext = NULL;
    14     } //删除只有一个结点的情况
    15     else if(*pListHead == pToBeDeleted)
    16     {
    17         free(pToBeDeleted);
    18         pToBeDeleted = NULL;
    19         *pListHead = NULL;
    20     }
    21     else//删除尾结点
    22     {
    23         ListNode* pNode = *pListHead;
    24         while (pNode->m_pNext != pToBeDeleted)
    25         {
    26             pNode = pNode->m_pNext;
    27         }
    28         pNode->m_pNext = NULL;
    29         free(pToBeDeleted);
    30         pToBeDeleted = NULL;
    31     }
    32 }
  • 相关阅读:
    安装hp驱动
    原来这才是真的卑躬屈膝
    vim好文集锦
    解决python交互时无法使用回格键
    难道父母比希望你快乐吗?
    从C 语言用户角度理解 Linux 的库
    树梅派屏幕旋转方法
    如此瘸了
    一首难忘的歌
    将安卓手机屏幕投射到 Linux
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3057346.html
Copyright © 2011-2022 走看看