在 O(1) 時間內刪除連結串列節點
題目描述
在 O(1) 時間內刪除連結串列節點。
方案:如果該節點不是尾節點,那麼可以直接將下一個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下一個節點,時間複雜度為 O(1)。否則,就需要先遍歷連結串列,找到節點的前一個節點,然後讓前一個節點指向 null,時間複雜度為 O(N)。
題目連結: [在 O(1) 時間內刪除連結串列節點]()
程式碼
/**
* 在 O(1) 時間內刪除連結串列節點
*/
public class Jz69 {
/**
* 方案:
* 如果該節點不是尾節點,那麼可以直接將下一個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下一個節點,時間複雜度為 O(1)。
* 否則,就需要先遍歷連結串列,找到節點的前一個節點,然後讓前一個節點指向 null,時間複雜度為 O(N)。
*
* @param head
* @param tobeDelete
* @return
*/
public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
if (head == null || tobeDelete == null) {
return null;
}
if (tobeDelete.next != null) {
// 要刪除的節點不是尾結點
ListNode next = tobeDelete.next;
tobeDelete.val = next.val;
tobeDelete.next = next.next;
} else {
if (head == tobeDelete) {
// 只有一個節點
head = null;
} else {
ListNode cur = head;
while (cur.next != tobeDelete) {
cur = cur.next;
}
cur.next = null;
}
}
return head;
}
public static void main(String[] args) {
}
}
【每日寄語】 竇燕山,有義方;教五子,名俱揚。