题目:在0(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在0(1)时间内删除该节点。
因为在O(1)的时间内,所以不用判断节点是否在链表中
首先定义一个链表的数据结构,
包括节点的值和上一节点,不要忘记构造器
删除节点的函数
判断头节点和要删除的节点不为空
当要删除的节点不是最后一个节点时,
用下一节点将要删除的节点覆盖
如果要删除的节点既是头节点又是尾节点时
将尾节点和头节点都置null;
最后如果删除的是尾节点就要老老实实的从头开始遍历,因为链表没有指向上一个节点的指针,时刻注意判断当前节点是否为空,
注意删除的节点不在当前单向链表之内的情况
还要一个打印节点的函数
package com.helan.c;
import java.util.List;
public class DeleteNode {
public class ListNode{
int val;
ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public static ListNode deleteNode(ListNode head,ListNode del){
if(head==null||del==null){
return head;
}
if(del.next!=null){ //1 2 3 4
ListNode tem=del.next;
del.val= tem.val;
del.next=tem.next;
tem=null;
}else if(del==head&&del.next==null){
head=null;
del=null;
}else {//如果是尾节点,先遍历出上一节点
ListNode pre=head;
while(pre.next.val!=del.val&&pre!=null){
pre=pre.next;
}
if (pre==null){
System.out.println("链表中没有该元素");
}
pre.next=null;
}
return head;
}
public static void printNode(ListNode head){
ListNode tem=head;
while(tem!=null){
System.out.print(tem.val);
tem=tem.next;
}
System.out.println();
}
public void test(ListNode head,ListNode pToBeDelete){
System.out.println("----------");
System.out.println("这个链表是如下:");
printNode(head);
System.out.println(pToBeDelete!=null?pToBeDelete.val+"节点将被删除:":"\n");
ListNode curr=deleteNode(head,pToBeDelete);
System.out.println("删除之后的结果是:");
printNode(curr);
}
/**
* 链表含多个结点,删除头结点
*/
void test1() {
ListNode p4=new ListNode(4, null);
ListNode p3=new ListNode(3, p4);
ListNode p2=new ListNode(2, p3);
ListNode p1=new ListNode(1, p2);
test(p1, p1);
}
/**
* 链表含多个结点,删除中间结点
*/
void test2() {
ListNode p4=new ListNode(4, null);
ListNode p3=new ListNode(3, p4);
ListNode p2=new ListNode(2, p3);
ListNode p1=new ListNode(1, p2);
test(p1, p3);
}
/**
* 链表含多个结点,删除尾结点
*/
void test3() {
ListNode p4=new ListNode(4, null);
ListNode p3=new ListNode(3, p4);
ListNode p2=new ListNode(2, p3);
ListNode p1=new ListNode(1, p2);
test(p1, p4);
}
/**
* 链表含一个结点,删除结点
*/
void test4() {
ListNode p4=new ListNode(4, null);
test(p4, p4);
}
/**
* 链表为空
*/
void test5() {
test(null, null);
}
public static void main(String[] args) {
new DeleteNode().test1();
new DeleteNode().test2();
new DeleteNode().test3();
new DeleteNode().test4();
new DeleteNode().test5();
}
}