1.问题
链表1--2--3--4--5--6--7 中指向第五个元素的指针,要求把节点5删除,删除之后链表变为 1--2--3---4--6--7
2.问题分析
通常,要删除单链表中的一个节点P,首先选用找到节点P的前驱节点pre,然后通过pre.next=p.next来实现对节点P的删除。对于此问题的节点P的前驱节点无法获取到,因此不能使用常用的方法。
1)如果这个节点是链表的最后一个节点,就无法删除该节点。
2) 如果不是链表的最后一个节点。
第一:找到该节点的后继节点。将后继节点的date域的值复制给当前节点。
第二:用常用的方法来删除后继节点。
3 代码实现
package linkedlist.Delete;
public class deleteNode {
public static void printlist(LNode head){
for (LNode cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.date+" ");
}
}
public static boolean deletenode(LNode p){
if (p==null||p.next==null){
return false;
}
p.date=p.next.date;
LNode tmp=p.next;
p.next=tmp.next;
return true;
}
public static void main(String[] args) {
int i=1;
LNode head=new LNode();
head.next=null;
LNode tmp=null;
LNode cur=head;
LNode p=null;
for (;i<8;i++){
tmp=new LNode();
tmp.date=i;
tmp.next=null;
cur.next=tmp;
cur=tmp;
if (i==5){
p=tmp;
}
}
System.out.print("原链表");
printlist(head);
System.out.println("\n删除节点P之后:");
boolean deletenode = deletenode(p);
if (deletenode){
System.out.println("删除成功,删除后节点为:");
printlist(head);
}else {
System.out.println("删除失败");
}
}
}