O(1)刪節點

12.給定單向鏈表的頭指針和一個節點的指針,定義一個函數在O(1)時間刪除該節點。

O(n):從頭遍歷到指定節點的前一個節點pre,然後將pre的next指向指定節點的下一個,刪除指定節點即可

O(1):將指定節點的下一個節點中的值複製到指定節點,並刪除下一節點

注:1.如果要刪除的是尾節點,沒有下一節點。則需要從頭節點開始,順序遍歷的到該節點的前一節點,完成刪除操作

     2.如果鏈表中只有一個節點,刪除節點後,要把鏈表的頭節點設爲null

public class javatest{
    public static class ListNode {
        int value; // 保存鏈表的值
        ListNode next; // 下一個結點
    }

    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 tmp = head;
            while (tmp.next != toBeDeleted) {
                tmp = tmp.next;
            }
            // 刪除待結點
            tmp.next = null;

        }
        // 在多個節點的情況下,如果刪除的是某個中間結點
        else {
            // 將下一個結點的值輸入當前待刪除的結點
            toBeDeleted.value = toBeDeleted.next.value;
            // 待刪除的結點的下一個指向原先待刪除引號的下下個結點,即將待刪除的下一個結點刪除
            toBeDeleted.next = toBeDeleted.next.next;
        }

        // 返回刪除節點後的鏈表頭結點
        return head;
    }

    public static void printList(ListNode head) {
        while (head != null) {
            System.out.print(head.value + "->");
            head = head.next;
        }
        System.out.println("null");
    }

    public static void main(String[] args) {


        ListNode head = new ListNode();
        head.value = 1;

        head.next = new ListNode();
        head.next.value = 2;

        head.next.next = new ListNode();
        head.next.next.value = 3;

        head.next.next.next = new ListNode();
        head.next.next.next.value = 4;

        ListNode middle = head.next.next.next.next = new ListNode();
        head.next.next.next.next.value = 5;

        head.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.value = 6;

        head.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.value = 7;

        head.next.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.next.value = 8;

        ListNode last = head.next.next.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.next.next.value = 9;

        head = deleteNode(head, null); // 刪除的結點爲空
        printList(head);
        ListNode node = new ListNode();
        node.value = 12;

        head = deleteNode(head, head); // 刪除頭結點
        printList(head);
        head = deleteNode(head, last); // 刪除尾結點
        printList(head);
        head = deleteNode(head, middle); // 刪除中間結點
        printList(head);

        head = deleteNode(head, node); // 刪除的結點不在鏈表中
        printList(head);
    }
}

輸出結果:

null
2->3->4->5->6->7->8->9->null
2->3->4->5->6->7->8->null
2->3->4->6->7->8->null

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