在O(1)时间删除链表节点
2018-07-17 本文已影响19人
lvlvforever
给定单向链表的头指针和一个结点指针,要求在O(1)时间内删除该结点。
删除结点分为三种情况
- 给定结点是头结点,则删除头结点,返回第二个结点。
- 给定结点不是尾结点,通常我们需要获取要删除结点的之前的一个结点,所以需要从head开始遍历,现在我们可以变通下,将toBeDeletedNode的后一个结点的val值放到toBeDeletedNode中,这样相当于把后一个结点复制到了要删除的结点中,然后把后一个结点删除即可。
- 给定结点是尾结点,那么为了获取前一个结点,需要遍历。
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;
}
}