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