給定單向鏈表的頭指針和一個(gè)結(jié)點(diǎn)指針,要求在O(1)時(shí)間內(nèi)刪除該結(jié)點(diǎn)。
刪除結(jié)點(diǎn)分為三種情況
- 給定結(jié)點(diǎn)是頭結(jié)點(diǎn),則刪除頭結(jié)點(diǎn),返回第二個(gè)結(jié)點(diǎn)。
- 給定結(jié)點(diǎn)不是尾結(jié)點(diǎn),通常我們需要獲取要?jiǎng)h除結(jié)點(diǎn)的之前的一個(gè)結(jié)點(diǎn),所以需要從head開(kāi)始遍歷,現(xiàn)在我們可以變通下,將toBeDeletedNode的后一個(gè)結(jié)點(diǎn)的val值放到toBeDeletedNode中,這樣相當(dāng)于把后一個(gè)結(jié)點(diǎn)復(fù)制到了要?jiǎng)h除的結(jié)點(diǎn)中,然后把后一個(gè)結(jié)點(diǎn)刪除即可。
- 給定結(jié)點(diǎn)是尾結(jié)點(diǎn),那么為了獲取前一個(gè)結(jié)點(diǎn),需要遍歷。
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;
}
}