• 在O(1)的时间内删除链表的指定结点


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

    struct ListNode{
      int value;

      ListNode* next;

    };

    函数定义:void DeleteNode(ListNode** PListHead,ListNode* pToBedelete);

    如上图所示,想要删除一个单链表的中的某个结点有两种方式:

    1、如上图中的( b)所示:要删除i结点,必须从头扫描,扫到h(i的前一个结点),然后让其next值指向j(i的下一个位置),然后就可以删除i了。此方法的复杂度为O(n),因为要删除某个结点必须找到其上一个结点,故需要从头遍历。

    2、如上图中的(c)所示:要删除i结点,可以先把i的下一节点的值赋给i结点,然后让i的next值指向下一节点的下一结点,就相当于删除i结点。(注意要保存i->next的这个结点,然后再删除),此算法复杂度为O(1),但是必须要求此要删除结点一定是链表中的结点,且当要删除的结点为最后一个结点时,必须用第一种方法,顺序遍历后找到最后一结点的上一结点,然后删除,但此方法的平均时间复杂度仍然为O(1).

    故代码如下:

    注意:delete结点后一定要让结点指向nullptr(每次都忘。。。)

     1 //在O(1)的时间删除链表指定的结点
     2 struct ListNode{
     3     int value;
     4     ListNode *next;
     5 };
     6 void DeleteNode(ListNode** pListHead, ListNode *pToBeDelete)
     7 {
     8     if (pListHead == nullptr || *pListHead == nullptr || pToBeDelete == nullptr)
     9         return;
    10     if (*pListHead == pToBeDelete&&pToBeDelete->next == nullptr)//若是头节点也是最后一个节点
    11     {
    12         delete pToBeDelete;
    13         pToBeDelete = nullptr;
    14         *pListHead = nullptr;
    15     }
    16     else if (*pListHead != pToBeDelete&&pToBeDelete->next == nullptr)//若是最后一个节点
    17     {
    18         ListNode* p = *pListHead;
    19         while (p->next!=pToBeDelete)
    20         {
    21             p = p->next;
    22         }
    23         delete pToBeDelete;
    24         pToBeDelete = nullptr;
    25         p->next = nullptr;
    26     }
    27     else{//要删除的节点不是尾节点
    28         ListNode* pd = pToBeDelete->next;
    29         pToBeDelete->value = pd->value;
    30         pToBeDelete->next = pd->next;
    31         delete pd;
    32         pd = nullptr;
    33     }
    34 }
  • 相关阅读:
    dapper+linq+json+ztree构建树
    ubuntu,从一个新用户,要转到新用户的命令行操作
    OC本学习笔记Foundatio框架集
    无法Debug SQL: Unable to start T-SQL Debugging. Could not attach to SQL Server process on
    Struts2 + uploadify 多文件上传完整的例子!
    How use Instruments and display the console in Command Lines applications
    Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航
    Android ActionBar详解(一):ActionBar概述及其创建
    Android Fragment详解(六):Fragement示例
    Android Fragment详解(五):Fragment与Activity通讯
  • 原文地址:https://www.cnblogs.com/General-up/p/5429073.html
Copyright © 2020-2023  润新知