劍指offer:刪除連結串列的節點---在O(1)時間內刪除連結串列節點
阿新 • • 發佈:2018-12-09
/** * 題目:(在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); } }