剑指Offer题解

在O(1)时间删除链表节点

2018-07-17  本文已影响19人  lvlvforever

给定单向链表的头指针和一个结点指针,要求在O(1)时间内删除该结点。

删除结点分为三种情况

  1. 给定结点是头结点,则删除头结点,返回第二个结点。
  2. 给定结点不是尾结点,通常我们需要获取要删除结点的之前的一个结点,所以需要从head开始遍历,现在我们可以变通下,将toBeDeletedNode的后一个结点的val值放到toBeDeletedNode中,这样相当于把后一个结点复制到了要删除的结点中,然后把后一个结点删除即可。
  3. 给定结点是尾结点,那么为了获取前一个结点,需要遍历。
 private ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
        if (head == null || toBeDeleted == null) {
            return null;
        }
        if (toBeDeleted == head) {
            ListNode next = head.next;
            head.next = null;
            toBeDeleted = null;
            return  next;
        } else if (toBeDeleted.next != null) {
            toBeDeleted.val = toBeDeleted.next.val;
            ListNode next = toBeDeleted.next.next;
            toBeDeleted.next.next = null;
            toBeDeleted.next = next;
            return head;
        }else{
            ListNode cur = head;
            while(cur.next != null && cur.next.next != null){
                cur = cur.next;
            }
            cur.next = null;
            return head;
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读