剑指Offer之O(1)删除链表结点

题目描述:

给定一个链表的头指针和要删除的结点指针,要求用O(1)时间复杂度删除结点。


思路:
  1. 如果删除的结点是尾结点,先找到尾结点的前驱节点,然后删除;
  2. 如果删除的结点不是尾结点,将要删除的结点的val值赋值为后继结点的val值,删除后继结点即可。

参考代码:
public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
   if(head == null || toBeDeleted == null)return head;
   if(head == toBeDeleted)return head.next;
   if(toBeDeleted.next == null){//说明是尾结点
      //找到前驱节点
      ListNode p = head;
      while(p.next != null && p.next != toBeDeleted){
          p = p.next;
      }
      if(p.next == toBeDeleted)p.next = null;
   }
   else{//不是尾结点
      toBeDeleted.val = toBeDeleted.next.val;
      toBeDeleted.next = toBeDeleted.next.next;
   }
   return head;
}

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章