• 【面试题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         }
  • 相关阅读:
    10月27号
    10月23号
    10月26号
    10月30号
    10月28号
    10月29号
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4802889.html
Copyright © 2020-2023  润新知