1、题目描述
给定单向链表的头指针和一个节点指针,在 O(1)时间复杂度内删除该节点。
2、问题分析
-
先把i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点。此时再删除节点j,其效果刚好是把节点i给删除了(图c);
-
如果要删除的节点位于链表的尾部,那么它就没有下一个节点,怎么办?我们让然从链表的头节点开始,顺序遍历得到该节点的前序节点,并完成删除操作;
-
如果链表中只有一个节点,而我们又要 链表的头节点(也是尾节点),此时我们在删除节点之后,还需要把链表的头节点设置为NULL。
3、代码
package swordForOffer;
import utils.ListNode;
public class E13DeleteNodeInList {
public void deleteNode(ListNode head,ListNode deListNode){
if(deListNode == null || head == null){
return ;
}
if(head == deListNode){
head =null;
}
else{
if(deListNode.next == null){
ListNode pinitListNode = head;
while(pinitListNode.next.next != null){
pinitListNode = pinitListNode.next;
}
pinitListNode.next = null;
}else{
deListNode.data = deListNode.next.data;
deListNode.next = deListNode.next.next;
}
}
}
}