需求:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:把下一结点的内容复制到需要删除的结点,删除下一结点,相当于删除当前结点。 当我们想删除一个结点时,并不一定要删除这个结点本身。可以先把下一个结点的内容复制出来覆盖被删除结点的内容,然后把下一个结点删除。如果待删除节点是头结点,删除头结点,并将待删除节点赋予null值;如果待删除节点是链表的尾节点,则需要从头结点开始遍历整个链表直到待删除节点前一个节点,然后将前一个节点的下一个结点赋予null值;
/*
* O(1)时间删除单链表某一结点
*/
public static void deleteNode(ListNode head, ListNode node){
if(head==null || node==null) return;
if(node.next!=null){
ListNode next = node.next;
node.val = next.val;
node.next = next.next;
}else if(head==node){
head = head.next ;
node = null;
}
//链表中有多个结点,删除尾结点
else{
ListNode pNode = head;
while(pNode.next!=node){
pNode = pNode.next;
}
pNode.next = null;
node = null;
}
}