双向链表
单链表缺点:查找只能一个方向,而双向链表可以向前向后查找
单链表删除只能靠辅助节点,双向链表可以靠自身删除
思路分析:
添加:
temp.next=newHeroNode;
newHeroNode.pre=temp;
修改:
找到需要修改的节点,按照no修改
删除:
package database;
import data.D;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode2 h1=new HeroNode2(1,"小黑","黑子");
HeroNode2 h2=new HeroNode2(2,"小红","红红");
HeroNode2 h3=new HeroNode2(3,"小蓝","蓝子");
HeroNode2 h4=new HeroNode2(4,"小紫","紫紫");
DoubleLinked dl=new DoubleLinked();
System.out.println("-------------有序添加节点----------");
dl.addByOrder(h3);
dl.addByOrder(h1);
dl.addByOrder(h4);
dl.addByOrder(h2);
dl.list();
/* System.out.println("-------------删除节点----------");
dl.del(1);
dl.list();*/
/* System.out.println("---------修改双向链表----------");
HeroNode2 h4=new HeroNode2(2,"小ww红","红ddd红");
dl.update(h4);
dl.list();*/
}
}
class DoubleLinked {
private HeroNode2 head = new HeroNode2(0, "", "");
//返回头节点
public HeroNode2 getHead() {
return head;
}
/*
public void setHead(HeroNode2 head) {
this.head = 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);
temp = temp.next;
}
}
//添加一个元素到链表最后
//按照添加顺序添加英雄
public void add(HeroNode2 heroNode) {
HeroNode2 temp = head;
//遍历链表
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = heroNode;
heroNode.pre = temp;
}
//添加英雄,按照顺序
public void addByOrder(HeroNode2 heroNode) {
HeroNode2 temp = head;
boolean falg = false;
while (true) {
if (temp.next == null) {
// System.out.println("数组为空");
break;
}
if (temp.next.no > heroNode.no) {
break;
}
if (temp.next.no == heroNode.no) {
System.out.println("已经存在");
falg = true;
}
temp = temp.next;
}
if (falg) {
System.out.println("数组已满");
} else {
heroNode.next = temp.next;
temp.next = heroNode;
heroNode.pre=temp;
}
}
//修改名字,昵称,根据no修改,且no不能改变
public void update(HeroNode2 newHeroNode) {
if (head.next == null) {
System.out.println("已到数组最后");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
System.out.println("修改的数组为空");
break;
}
if (temp.no == newHeroNode.no) {
//找到修改节点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = newHeroNode.name;
temp.nikname = newHeroNode.nikname;
} else {
//没找到修改的节点
System.out.println("未找到对应的节点");
}
}
//删除节点(自我删除) temp就是需要删除的节点
public void del(int no) {
if (head.next == null) {
System.out.println("链表为空,无法删除");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
// System.out.println("已经遍历完最后一个节点,删除节点为空");
break;
}
if (temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//temp.next = temp.next.next;
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
} else {
System.out.println("删除的节点没找到!");
}
}
}
}
class HeroNode2{
public int no;
public String name;
public String nikname;
public HeroNode2 next; //指向下一个节点
public HeroNode2 pre;//指向上一个节点
//构造器
public HeroNode2(int no, String name, String nikname){
this.no=no;
this.name=name;
this.nikname=nikname;
}
@Override
public String toString() {
return "HeroNode2{" +
"no=" + no +
", name='" + name + '\'' +
", nikname='" + nikname + '\'' +
'}';
}
}