zoukankan      html  css  js  c++  java
  • 【面试题13】在O(1)时间删除链表结点

    【题目描述】

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

    【解决方案】

    要删除结点i,可以先把下一个结点j的内容复制给i,然后把i的指针指向结点j的下一个结点。此时再删除结点j,其效果刚好是把结点i给删除了。

    考虑情况:

    1. 要删除的结点不是尾结点的情况;

    2. 链表只有一个结点,删除头结点(也是尾结点);

    3. 链表中有多个结点,删除尾结点;

    我的代码实现,仅供参考:

     1         public static void DeleteNode(ref ListNode head, ListNode nodeDel)
     2         {
     3             //要删除的结点不是尾结点
     4             if (nodeDel.Next != null)
     5             {
     6                 ListNode pNext = nodeDel.Next;
     7                 nodeDel.Value = pNext.Value;
     8                 nodeDel.Next = pNext.Next;
     9             }
    10             //要删除的结点是头结点(也是尾结点)
    11             else if (head == nodeDel)
    12             {
    13                 head = null;
    14             }
    15             //要删除的结点是尾结点,需要从头遍历
    16             //平均时间复杂度计算:
    17             //[(n-1)*O(1)+O(n)]/n = O(1)
    18             else
    19             {
    20                 while (head.Next != nodeDel)
    21                 {
    22                     head = head.Next;
    23                 }
    24                 head.Next = null;
    25             }
    26         }
  • 相关阅读:
    Unlocker(强力删除文件工具) 1.9.2 汉化绿色版
    js 用blob来显示存储资源,并清除其他资源
    js 创建音频声音
    兼容 线性渐变
    @font-face 兼容写法
    中国行政区域划分 爬虫工具
    前端中的spring实现
    css命名规范
    sass 备忘命令
    charles 破解命令
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4802889.html
Copyright © 2011-2022 走看看