双向链表的增删改查
和单链表的操作很像:https://blog.csdn.net/weixin_43304253/article/details/119758276
基本结构
1、增加操作
- 1、链接cur与pre和next,其中的next是pre的下一个节点
- 2、用cur重新连接
在尾部添加代码实现
//添加 从尾部添加
public void addEnd(Student1 student1){
Student1 temp=head1;//辅助
while(true){
if(temp.next==null){
break;
}
temp=temp.next;
}
//找到链表最后
temp.next=student1;//将最后的节点指向指向新的节点
student1.pre=temp;//将最后的节点作为新节点的前一个指向
}
2、删除操作
1、确定待删除的元素
2、修改指向
删除的代码实现
//删除
public void deleteNode(int num){
Student1 temp=head1.next;
while (true){
if(temp==null){
System.out.println("链表为空");
return;
}
if(temp.id==num){ //找到待删除的节点
temp.pre.next=temp.next;
temp.pre=temp.next.pre;//如果删除的是最后的元素则会出现风险
break;
}
temp=temp.next;
}
}
实例:
双向链表存储学生的信息
package com.zheng.demo3;
public class MyDoubleLinkList {
public static void main(String[] args) {
//定义节点
Student1 student1 = new Student1(1, "小明", "男");
Student1 student2 = new Student1(2, "小红", "女");
Student1 student3 = new Student1(3, "小黑", "男");
Student1 student4 = new Student1(4, "小青", "女");
DoubleLinkList doubleLinkList = new DoubleLinkList();
doubleLinkList.addEnd(student1);
doubleLinkList.addEnd(student2);
doubleLinkList.addEnd(student3);
doubleLinkList.addEnd(student4);
System.out.println("遍历双向链表");
doubleLinkList.queryLinkList();
doubleLinkList.deleteNode(3);
System.out.println("删除id为3的节点");
doubleLinkList.queryLinkList();
}
}
class DoubleLinkList{
private Student1 head1=new Student1(0,"","");
//添加 从尾部添加
public void addEnd(Student1 student1){
Student1 temp=head1;//辅助
while(true){
if(temp.next==null){
break;
}
temp=temp.next;
}
//找到链表最后
temp.next=student1;//将最后的节点指向指向新的节点
student1.pre=temp;//将最后的节点作为新节点的前一个指向
}
//删除
public void deleteNode(int num){
Student1 temp=head1.next;
while (true){
if(temp==null){
System.out.println("链表为空");
return;
}
if(temp.id==num){ //找到待删除的节点
temp.pre.next=temp.next;
temp.pre=temp.next.pre;//如果删除的是最后的元素则会出现风险
break;
}
temp=temp.next;
}
}
//遍历
public void queryLinkList() {
if (head1.next== null) {
System.out.println("链表为空");
return;
}
Student1 temp = head1;
while (true) {
if (temp.next == null) {
return;
}
System.out.println(temp.next);
temp = temp.next;
}
}
}
//定义一个学生信息的节点类
class Student1 {
int id;//学号
String name;//姓名
String sex;//性别
Student1 next;//指向下一个学生的节点
Student1 pre;//指向前一个节点
public Student1(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}