/**
* 双向链表
*/
public class DoubleLinkedListDemo {
public static void main(String[] args) {
System.out.println("===========双向链表测试");
// 创建测试节点
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.sequenceAdd(hero3);
doubleLinkedList.sequenceAdd(hero1);
doubleLinkedList.sequenceAdd(hero2);
doubleLinkedList.sequenceAdd(hero4);
// 遍历打印
doubleLinkedList.list();
// 修改节点
System.out.println("===========修改后的双向链表测试");
HeroNode2 newHeroNode = new HeroNode2(4, "公孙胜", "入云龙");
doubleLinkedList.update(newHeroNode);
doubleLinkedList.list();
// 删除
System.out.println("===========删除后的双向链表测试");
doubleLinkedList.del(3);
doubleLinkedList.list();
}
}
/**
* 双向链表管理类
*/
class DoubleLinkedList {
/**
* 初始化头一个节点,不存放具体的数据
*/
private HeroNode2 head = new HeroNode2(0, "", "");
/**
* 返回头节点
*/
public HeroNode2 getHead() {
return head;
}
/**
* 遍历链表
*/
public void list() {
// 判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 定义辅助指针
HeroNode2 temp = head.next;
while (true) {
// 判断链表是否为空
if (temp == null)
break;
System.out.println(temp.toString());
// 指针后移
temp = temp.next;
}
}
/**
* 添加节点到双向列表
*/
public void add(HeroNode2 heroNode) {
// 定义辅助指针
HeroNode2 temp = head;
// 遍历链表
while (true) {
// 找到链表的最后
if (temp.next == null)
break;
// 如果没有找到最后,将temp后移
temp = temp.next;
}
// 当退出while循环时,temp就指向了链表的最后
// 将当前这个节点的next 指向 新的节点
temp.next = heroNode;
// 添加的节点的pre,指向当前节点
heroNode.pre = temp;
}
/**
* 根据 no 排序添加
*/
public void sequenceAdd(HeroNode2 heroNode) {
// 定义指针
HeroNode2 temp = head;
// 如果链表为空,则直接添加
if (temp.next == null) {
temp.next = heroNode;
heroNode.pre = temp;
return;
}
// 标识符,表示要添加节点的 no 是否存在
boolean flag = false;
// 遍历链表,寻找插入点
while (true) {
// 如果已经遍历到了链表最后,则结束循环
if (temp.next == null)
break;
// 如果找到位置,则添加
if (temp.next.no > heroNode.no)
break;
// 如果存在相同的 no,则拒绝添加
if (temp.next.no == heroNode.no) {
flag = true;
break;
}
// 指针后移,继续遍历
temp = temp.next;
}
// 如果存在相同的 no
if (flag) {
throw new RuntimeException("添加的编号已存在,拒绝添加");
}
// 执行添加
heroNode.pre = temp;
// 添加节点的下一个节点,是指针节点的下一个节点
heroNode.next = temp.next;
if (heroNode.next != null)
heroNode.next.pre = heroNode;
// 指针节点的下一个节点是,新添加的节点
temp.next = heroNode;
}
/**
* 修改链表节点内容
*/
public void update(HeroNode2 newHeroNode) {
if (head.next == null)
throw new RuntimeException("链表为空");
// 定义指针,指向当前节点
HeroNode2 temp = head.next;
// 定义标识符,表示是否找到该节点
boolean flag = false;
// 遍历链表,寻找插入点
while (true) {
// 如果当前节点指针指向null,表示链表遍历结束
if (temp == null)
break;
// 匹配节点,如果找到需要修改的节点,结束循环
if (temp.no == newHeroNode.no) {
flag = true;
break;
}
// 如果没找到要修改的节点,就继续遍历
temp = temp.next;
}
// 如果找到,执行修改
if (flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
} else {
System.out.printf("没有找到 编号 %d 的节点,不能修改\n", newHeroNode.no);
}
}
/**
* 删除一个节点
*/
public void del(int no) {
// 判断当前链表,是否为空
if (head.next == null)
throw new RuntimeException("链表为空");
// 定义指针,指向要删除的节点
HeroNode2 temp = head.next;
// 标记是否找到待删除节点
boolean flag = false;
// 遍历寻找要删除的节点
while (true) {
// 判断是否找到链表最后节点
// 当指针指向最后一个数据的后一个位置,则表示链表遍历完毕
if (temp == null)
break;
// 判断是否找到要删除的节点
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.printf("要删除的 %d 节点不存在\n", no);
}
}
}
/**
* 定义Node,每个Node对象就是一个节点
* <p>
* 结构:Value,Next,Pre
*/
class HeroNode2 {
/**
* 实际的数据
*/
public int no;
public String name;
public String nickname;
/**
* 指向下一个节点
* <p>默认为:null</p>
*/
public HeroNode2 next;
/**
* 指向上一个节点
* <p>默认为:null</p>
*/
public HeroNode2 pre;
/**
* 创建链表
*/
public HeroNode2(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickname = nickName;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + "}";
}
}
java 实现双向链表
最新推荐文章于 2024-08-12 16:47:32 发布