双向链表在删除节点时不需要找到要删除节点的前一个结点,这是比较好的,但是增删都要同时处理前后两个指针的问题,
package SingleLinkedList;
//实现双链表的增删改查功能
public class twoLinkedListDemo {
public static void main(String[] args) {
//测试类
twoLinkedList tll = new twoLinkedList();
//创建一个节点进行插入测试
Node h1 = new Node(1, "宋江", "及时雨");
Node h4 = new Node(4, "张顺", "浪里白条");
Node h3 = new Node(3, "李逵", "黑旋风");
Node h2 = new Node(2, "吴用", "智多星");
tll.list();
tll.addNode(h1);
tll.addNode(h4);
tll.addNode(h3);
tll.addNode(h2);
tll.list();
tll.deleteNode(3);
tll.list();
// System.out.println("删除后的链表为 :");
}
}
//定义节点
class Node{
int no;
String name;
String nickname;
Node pre;//指向前一个结点
Node next;//指向后一个节点
//在构造方法中将节点初始化
public Node(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
//创建双向链表
class twoLinkedList{
//初始化一个头节点
Node head = new Node(0,"","");
//这里无须为pre,next 赋值,默认为null
//增加节点方法
public void addNode(Node node){
// head.pre = null;
//使用变量来保存头节点
Node temp = head.next;
boolean flag = false;
while(true){
//如果为空,直接加入
if(head.next == null){
head.next = node;
node.pre = head;
flag = true;
break;
}
if(temp.next == null){//如果temp.next为空,直接插到末尾
temp.next = node;
node.pre = temp;
flag = true;
break;
}
//设置变量来表示是否插入成功
if(temp.no == node.no){
break;
}
if(temp.next.no > node.no){
//满足条件,进行插入
//具体的插入代码,这里是出错的地方
temp.next.pre = node;
node.pre = temp;
node.next = temp.next;
temp.next = node;
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.printf("编号为%d的节点插入成功\n",node.no);
}else{
System.out.println("插入失败");
}
}
//遍历链表方法
public void list(){
//定义临时变量
if(head.next == null){
System.out.println("当前链表为空 ");
}
Node cur = head.next;
while(true){
if(cur == null){
break;
}
System.out.println(cur);
cur = cur.next;
}
}
//删除节点
public void deleteNode(int no) {
boolean flag = false;
Node temp = head.next;
if (head.next == null) {
System.out.println("当前链表为空,无法删除");
return;
}
while (true) {
if (temp == null) {
System.out.println(" 没有找到该节点");
break;
}
if (temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//具体的删除代码,注意第二个if语句的使用,当要删除的节点为最后一个时,没有这个if判断导致空指针异常
temp.pre.next = temp.next;
if(temp.next != null){
temp.next.pre = temp.pre;
}
System.out.println("删除成功");
} else {
System.out.println("没找到,删除失败");
}
}
}