package com.wang;
public class DoubleList {
public static void main(String[] args) {
HeroNode1 hero1 = new HeroNode1(1,"宋江","及时雨");
HeroNode1 hero2 = new HeroNode1(2,"卢俊义","玉麒麟");
HeroNode1 hero3 = new HeroNode1(3,"吴用","智多星");
System.out.println("增");
DoubleList1 doubleList1 = new DoubleList1();
doubleList1.add1(hero1);
doubleList1.add1(hero3);
doubleList1.add1(hero2);
doubleList1.list();
System.out.println("改");
HeroNode1 newh = new HeroNode1(3,"公孙胜","入云龙");
doubleList1.update(newh);
doubleList1.list();
System.out.println("删");
doubleList1.del(3);
doubleList1.list();
}
}
class DoubleList1 {
// 先初始化一个头结点,该节点不要动,只是起到标识作用
private HeroNode1 head = new HeroNode1(0, "", "");
public HeroNode1 getHead() {
return head;
}
/**
* 遍历双向链表
*/
public void list() {
if (head.next == null) {
System.out.println("空链表");
return;
}
HeroNode1 temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
/**
* 添加节点
* 暂不考虑排名,只是把新节点放到末尾
*/
public void add(HeroNode1 heroNode) {
//辅助遍历节点temp
HeroNode1 temp=head;
while (true) {
//找到最后一个节点,结束循环
if (temp.next==null) {
break;
}
temp = temp.next;
}
//循环结束后,temp就到达了尾结点,
//将新节点挂在末尾,并指向前一个节点
temp.next=heroNode;
heroNode.pre=temp;
}
/**
* 删除节点
* 从第一个节点开始找,找到后自我删除
*/
public void del(int no) {
HeroNode1 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前节点(next域)指向temp的后节点
temp.pre.next=temp.next;
//temp后节点(pre域)指向temp的前节点
//如果temp已经到了最后节点的下一个就不能执行该句
if (temp.next != null) {
temp.next.pre = temp.pre;
}
}else {
System.out.println("未找到"+no);
}
}
/**
* 修改节点信息,根据编号进行查找
*/
public void update(HeroNode1 newHeroNode) {
HeroNode1 temp = head.next;
boolean flag = false;
while (true) {
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.println("未找到" + newHeroNode.no);
}
}
/**
* 添加节点
* 根据排名添加,考虑添加到最后一个节点的情况
* 找到最后一个节点,结束循环
* 找到要插入的位置,结束循环
* 找到排名相同的,结束循环
*/
public void add1(HeroNode1 heroNode) {
//辅助遍历节点temp
HeroNode1 temp=head;
boolean flag=false;
while (true) {
if (temp.next==null) {
break;
}else if (temp.next.no>heroNode.no) {
break;
}else if(temp.next.no==heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
//根据flag的值判断能否插入
if (flag) {
System.out.println(heroNode.no+"已存在,不能重复添加");
}else {
heroNode.next = temp.next;
//如果它不是最后一个节点
if(temp.next!=null) {
//如果是空,那么它的pre就没必要指向前一个节点
temp.next.pre=heroNode;
}
heroNode.pre=temp;
temp.next=heroNode;
}
}
}
/**
* 该类用于定义及初始化
*/
class HeroNode1{
/**
* 排名
* 名字
* 称号
* 指向下一个节点
* 指向上一个节点
*/
public int no;
public String name;
public String nickname;
public HeroNode1 next;
public HeroNode1 pre;
public HeroNode1(int no, String name, String nickname) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
双向链表的增删改查
最新推荐文章于 2023-12-17 22:30:05 发布