package com.hao.firstdemo.datastruct;
/**
* @author haoxiansheng
*/
public class TestDoubleLinkedList {
public static void main(String[] args) {
//测试 你就可以在这里玩链表了 哈哈
HeroNode2 node1 = new HeroNode2(1, "曹操", "奸雄");
HeroNode2 node2 = new HeroNode2(2, "刘备", "小人");
HeroNode2 node3 = new HeroNode2(3, "赵云", "忠义之士");
HeroNode2 node4 = new HeroNode2(4, "关羽", "关二爷");
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.add(node1);
linkedList.add(node2);
linkedList.add(node3);
linkedList.add(node4);
linkedList.show();
linkedList.del(1);
linkedList.del(4);
linkedList.show();
HeroNode2 node21 = new HeroNode2(3, "吗啡", "忠义之士");
linkedList.update(node21);
linkedList.show();
}
}
/**
* 创建一个双向链表
*/
class DoubleLinkedList {
//先初始化一个头节点,头节点不要动 不存放具体数据 后续遍历查找需要使用头节点
private HeroNode2 head = new HeroNode2(0, "", "");
//返回头节点
public HeroNode2 getHead() {
return head;
}
/**
* 显示链表
*/
public void show() {
if (head.next == null) {
System.out.println("链表为null");
}
HeroNode2 temp = head.next;
while (true) {
if (temp == null) {
System.out.println("链表为空");
return;
}
//打印信息、节点后移
System.out.println(temp);
temp = temp.next;
}
}
/**
* 添加一个节点到双向链表
*
* @param heroNode
*/
public void add(HeroNode2 heroNode) {
//借助辅助变量
HeroNode2 temp = head;
//遍历找到最后
while (temp.next != null) {
temp = temp.next;
}
//循环退出说明找到了最后
temp.next = heroNode;
heroNode.pre = temp;
}
/**
* 双向链表的修改和单向链表基本一样
*
* @param heroNode
*/
public void update(HeroNode2 heroNode) {
if (head.next == null) {
System.out.println("链表为null");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break; //已经遍历完
}
if (temp.number == heroNode.number) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = heroNode.name;
temp.nickName = heroNode.nickName;
} else {
System.out.println("没有找到节点");
}
}
/**
* 双向链表删除 找到后直接删除就行
*
* @param number
*/
public void del(int number) {
HeroNode2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break; //已经遍历完没有找到
}
if (temp.number == number) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
if (temp.pre != null) {
temp.pre.next = temp.next;
}
if (temp.next != null) {
temp.next.pre = temp.pre;
}
} else {
System.out.println("删除的节点不存在, number" + number);
}
}
}
//定义一个节点 每个HeroNode2 对象就是一个节点
class HeroNode2 {
public int number;
public String name; //名字
public String nickName; //昵称
public HeroNode2 next; // 指向下一个域
public HeroNode2 pre; //指向前一个域
/**
* 构造器
*
* @param number
* @param name
* @param nickName
*/
public HeroNode2(int number, String name, String nickName) {
this.number = number;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode{" +
"number=" + number +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}