题目:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)的时间删除该结点。
答案:
如果要遍历到要删除节点的上一个节点,再去删除,则需要O(n)的时间复杂度了
因此我们考虑删除deletedNode的下一个节点,只是把下一个节点的值赋值给deletedNode,
这样就相当于删除了deletedNode。
注意deletedNode可能是尾节点,则只能遍历了。
public void deleteListNode(ListNode head, ListNode deletedNode) {
if (head == null || deletedNode == null) {
return;
}
if (deletedNode.next != null) {
ListNode next = deletedNode.next;
//将下一个节点的值赋值给deletedNode
deletedNode.value = next.value;
//删除deletedNode的下一个节点
deletedNode.next = next.next;
} else if (head == deletedNode) {//链表只有一个头节点
//删除头结点,这里就直接把head置为空把
head = null;
} else {//链表中有多个节点,删除尾节点,只能遍历
ListNode p = head;
while (p.next != deletedNode) {
p = p.next;
}
p.next = null;
}
}