题目描述: 给定单向链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。
解题思路: 正常的思路,如果想删除单链表中的一个节点,肯定是要找到这一节点的前一个节点,但是这样遍历寻找复杂度就是 O(n) 了。
换一种思维方式,可以将待删除节点下一个节点的值赋到待删除节点上,然后将待删除节点的下一个节点删除(前提是待删除节点不是链表中的最后一个节点),如果待删除节点是链表的最后一个节点,还是用遍历寻找前一个节点的方式,最后的时间复杂度就是 O(1) 。
需要注意,这种方法的前提是待删除节点一定在链表中,如果要判断的话,还是需要遍历寻找一遍。
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 {
ListNode cur = head;
while (cur.next != tobeDelete)
cur = cur.next;
cur.next = null;
}
return head;
}