class Node{
int val;
Node next;
public Node(int val){
this.val = val;
}
}
public class DeleteNode
{
/*
* O(1)时间删除链表中的结点
*
* 思路:删除链表中的结点需要知道待删除结点的前置结点
* 1、普通思路为顺序遍历链表,找到目标删除的结点的前置结点,将待删除结点删除,时间复杂度O(n)
* 2、O(1)删除链表中的结点:将待删除结点的后置结点的值赋给待删除结点,然后将其后置结点删除
* 2.1 待删除结点不是尾结点
* 2.2 链表中只有一个结点(head == delNode,自然而然其就是尾结点)
* 2.3 链表中有多个结点,待删除结点为尾结点,此时需要根据头结点遍历到待删除结点的前置结点
*
*时间复杂度:
*最好的情况:不是尾结点或链表只有一个结点 时间复杂度为O(1)
*最坏的情况:链表有多个结点,待删除结点为链表的尾结点,时间复杂度O(n-1)
*平均复杂度O(1) = (O(1) + (n-1)O(1))/n
*/
public void deleteNode(Node head, Node delNode){
if(head == null || delNode == null){
return;
}
if(delNode.next != null){ //待删除结点不是尾结点
Node nextNode = delNode.next;
delNode.val = nextNode.val;
delNode.next = nextNode.next;
nextNode = null;
return;
}
if(head == delNode){ //链表中只有一个结点
head = null;
delNode = null;
return;
}
//链表有多个结点,待删除结点为尾结点
Node node = head;
while(node.next != delNode){
node = node.next;
}
node.next = null;
}
}