创建节点对象
// 定义节点,每个heroNode对象都是一个节点
class HeroNode2 {
int no;
String name;
String nickName;
HeroNode2 next;
HeroNode2 pre;
public HeroNode2(int no, String name, String nickName) {
this.no = no;
this.nickName = nickName;
this.name = name;
}
@Override
public String toString() {
return "HeroNode2{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
双向链表的操作类
/**
* 双向链表的操作
*/
class DoubleLinkedList {
private HeroNode2 head = new HeroNode2(0, "", "");
public HeroNode2 getHeadNode(){
return head;
}
/**
* 删除双向链表的一个节点
*
* 思路:
* 1.因为是双向链表,所以可以自我删除某个节点
* 2.直接找到要删除的节点,比如temp
* 3.temp.pre.next = temp.next 要删除节点的前一个节点 指向(next) 要删除节点的后一个节点
* 4.temp.next.pre = temp.pre; 要删除节点的后一个节点 前指向(pre) 要删除节点的前一个节点.(注意:删除最后一个节点时,不用删除前指向,否则出现空指针)
*
* @param no 节点编号
*/
public void del(int no){
HeroNode2 temp = head;
if(temp.next == null){
System.out.println("删除失败,链表为空");
return;
}
boolean flag = false;
while(temp != null){ // 已经到链表的最后了
if(temp.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.pre.next = temp.next;
if(temp.next != null){
temp.next.pre = temp.pre;
}
}else{
System.out.println("双向链表中没有该数据,删除失败");
}
}
/**
* 双向链表的更新,和单链表中的一样
* @param
*/
public void update(HeroNode2 newNode){
HeroNode2 temp = head.next;
while(temp != null){
if(temp.no == newNode.no){
temp.name = newNode.name;
temp.nickName = newNode.nickName;
break;
}
temp = temp.next;
}
}
/**
* 双向链表的添加(添加到链表的最后)
* 思路:
* 1.先找到双向链表的最后一个节点;
* 2.temp.next = newNode;
* 3.newNode.pre = temp;
*
* @param newNode
*/
public void add(HeroNode2 newNode){
HeroNode2 temp = head;
while (true){
if(temp.next == null){
// 行成一个双链表
temp.next = newNode;
newNode.pre = temp;// 新节点的pre指向temp
break;
}
temp = temp.next;
}
}
/**
* 双向链表的遍历,和单链表一样,只是可以向前,也可以向后查找
*/
public void list(){
if(head.next == null){
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
while(temp != null){
System.out.println(temp);
temp = temp.next;
}
}
}
双向链表的测试
/**
* @author AN
* @create 2020-08-10 13:31
*/
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");
HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.add(hero1);
doubleLinkedList.add(hero3);
doubleLinkedList.add(hero2);
doubleLinkedList.add(hero4);
doubleLinkedList.list();
HeroNode2 newNode = new HeroNode2(3, "吴用1123", "智多星123");
doubleLinkedList.update(newNode);
System.out.println("修改之后的双向链表");
doubleLinkedList.list();
doubleLinkedList.del(4);
System.out.println("删除之后的双向链表");
doubleLinkedList.list();
}
}
测试结果