【面试题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         }

 

posted @ 2015-09-12 13:37  叫我霍啊啊啊  阅读(165)  评论(0编辑  收藏  举报