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         }
  • 相关阅读:
    Nginx进程信号管理
    Nginx配置缓存服务器
    访问Nginx显示目录
    kubeadm快速安装k8s
    《构建之法》读书笔记(一)
    Android Studio连接SQLite数据库与SQLite Studio实时同步的实现
    关于sqlite数据库与sqlite studio
    AS之去掉顶部标题栏
    今日学习
    AS之AlertDialog使用
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4802889.html
Copyright © 2011-2022 走看看