思路:
1、我们要删除节点i,先把节点i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点,因此删除节点j;等同于删除节点i;
2、如果节点位于链表的尾部,那么只能从头节点开始遍历并删除
3、如果只有一个节点时,删除节点之后,还需要把链表的头节点设置为null;
时间复杂度分析:
对于n-1个非尾节点而言,时间复杂度为O(1);
对于尾结点而言,时间复杂度为O(n);
总的平均时间复杂度为:[(n-1)*O(1)+O(n)]/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 {
if (head == tobeDelete)
// 只有一个节点
head = null;
else {
ListNode cur = head;
while (cur.next != tobeDelete)
cur = cur.next;
cur.next = null;
}
}
return head;
}