1. 程式人生 > >劍指offer:刪除連結串列的節點---在O(1)時間內刪除連結串列節點

劍指offer:刪除連結串列的節點---在O(1)時間內刪除連結串列節點

/**
 * 題目:(在O(1)時間內刪除連結串列節點)
 *      給定單鏈表的頭指標和節點指標,定義一個函式在O(1)時間內刪除節點。
 * 解題思路:
 *       把下一個節點的內容複製到要刪除的節點上覆蓋原有的內容,再把下一個節點刪除。
 *       特殊情況:
 *          1)刪除的節點位於連結串列的尾部,需要從連結串列的頭結點開始,順序遍歷得到該節點的前序節點,並完成刪除操作。
 *          2)連結串列中只有一個節點,又要刪除連結串列的頭節點(也是尾節點),那麼,在刪除節點之後,還要把連結串列的頭節點設定為空
 *     總的平均時間複雜度:[(n-1)*O(1)+O(n)]/n,結果還是O(1),符合要求。
 */
public class P119_DeleteNodeByO1 {
        public void DeleteNodeByO1(ListNode pListNode,ListNode pToBeDeleted){

            //要刪除的節點是中間的普通節點
            if (pToBeDeleted.next != null) {
                ListNode temp = pToBeDeleted.next;
                pToBeDeleted.val = temp.val;
                pToBeDeleted.next = temp.next;
            }

            //連結串列中只有一個節點,刪除頭節點(也是尾節點)
            else if (pToBeDeleted == pListNode) {
                pListNode = null;
            } else {
                while (pListNode.next != pToBeDeleted) {
                    pListNode = pListNode.next;
                }
                pListNode.next = null;
            }
        }
    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode node1 = new ListNode(2);
        ListNode node2 = new ListNode(3);
        ListNode node3 = new ListNode(4);
        ListNode node4 = new ListNode(5);

        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = null;

        P119_DeleteNodeByO1 test = new P119_DeleteNodeByO1();
        test.DeleteNodeByO1(head,node2);
        System.out.print(node1.next.val);
    }
}