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 }
  • 相关阅读:
    属性绑定与双向数据绑定
    vue基础
    tp5提交留言入库
    tp5表单提交
    TP5分页
    TP5模板与数据组合
    vue3.x使用Proxy做双向数据绑定总结
    vue2.x响应式原理总结
    HTML5移动端自适应解决方案
    springMVC实现文件上传
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3057346.html
Copyright © 2011-2022 走看看