题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。
思路:
要删除的节点i,先把i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点。此时再删除节点j,其效果刚好是把节点i给删除了。
上述问题还有一个问题;如果要删除的节点位于链表的尾部,那么它就没有下一个节点,怎么办?我们让然从链表的头节点开始,顺序遍历得到该节点的前序节点,并完成删除操作。
最后需要注意的是,如果链表中只有一个节点,而我们又要 链表的头节点(也是尾节点),此时我们在删除节点之后,还需要把链表的头节点设置为NULL。、
java实现:
public class ListNode {
int val;
ListNode next=null;
ListNode(){
}
ListNode(int val){
this.val=val;
}
ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
public class DeleteNode {
public static void deleteNode(ListNode head,ListNode node) {
if(head==null||node==null) return;
//要删除的不是尾结点
if(head.next!=null) {
node.val=node.next.val;
node.next=node.next.next;
}
//链表只有一个结点,删除头结点
else if(head==node) {
head=null;
}
//链表有多个结点,要删除的是尾节点,从头遍历到尾
else {
while(head.next!=node) {
head=head.next;
}
head.next=null;
}
}
public static void main(String[] args) {
ListNode tail=new ListNode(1,null);
ListNode c=new ListNode(2,tail);
ListNode b=new ListNode(3,c);
ListNode head=new ListNode(4,b);
deleteNode(head,c);
while(head!=null) {
System.out.println(head.val);
head=head.next;
}
}
}