题目: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:把下一结点的内容复制到需要删除的结点,删除下一结点,相当于删除当前结点。 当我们想删除一个结点时,并不一定要删除这个结点本身。可以先把下一个结点的内容复制出来覆盖被删除结点的内容,然后把下一个结点删除。
假定待删除结点在链表中。
/*
* 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;
}
}