package DataStructure;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 86178
* Date: 2024-02-11
* Time: 11:45
*/
public class DoubleListDemo {
public static void main(String[] args) {
System.out.println("测试双向链表的代码");
HeroNode2 n1=new HeroNode2(1,"貂蝉","貂蝉");
HeroNode2 n2=new HeroNode2(2,"西施","西施");
HeroNode2 n3=new HeroNode2(3,"王昭君","王昭君");
HeroNode2 n4=new HeroNode2(4,"杨玉环","杨玉环");
HeroNode2 n5=new HeroNode2(5,"唐玄宗","唐玄宗");
HeroNode2 newnode=new HeroNode2(5,"乾隆","乾隆");
DoubleList l=new DoubleList();
//todo 添加
l.add(n1);
l.add(n2);
l.add(n3);
l.add(n4);
l.add(n5);
l.list();
//todo 修改
l.update(newnode);
l.list();
//todo 删除
l.delete(3);
l.list();
}
}
class DoubleList{
//初始化头节点
private HeroNode2 head=new HeroNode2(0,"","");
//返回头节点
public HeroNode2 getHead(){
return head;
}
//遍历双向链表的方法
public void list(){
if(head.next==null){
System.out.println("链表为空");
return;
}
//todo head不存放具体的数据,head指向链表的头节点
HeroNode2 cur=head.next;
while(cur!=null){
System.out.println(cur);
cur=cur.next;
}
System.out.print("null\n");
}
//todo 不考虑英雄的编号顺序
public void add(HeroNode2 h){
HeroNode2 cur=head;
//todo 改变链表结构需要遍历至null的前一个节点,从而添加元素
while(cur.next!=null){
cur=cur.next;
//找到链表末尾
}
//形成双向链表
cur.next=h;
h.pre=cur;
}
//todo 删除一个节点
//todo 对于双向链表 可以直接查找到待删除节点
public void delete(int n){
HeroNode2 cur=head.next;
if(cur==null) return;
while(cur.no!=n && cur!=null){
cur=cur.next;
}
if(cur==null){
//说明没找到
System.out.println("没有找到待删除节点");
}else{
//找到了
cur.pre.next=cur.next;
//todo 如果删除的是尾节点 则 cur.next.pre=cur.pre 代码会出现空指针异常
if(cur.next!=null) {
cur.next.pre = cur.pre;
}
}
}
//todo 修改节点信息 no不能改
public void update(HeroNode2 newNode){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 cur=head.next;
boolean flag=false;
while(true){
if(cur==null){
//到了最后的null
break;
}else if(cur.no==newNode.no){
//说明找到了
flag=true;
break;
}
cur=cur.next;
}
if(flag){
//找到了待修改节点
cur.name=newNode.name;
cur.nickName=newNode.nickName;
}else{
System.out.printf("没有找到编号为%d的节点\n",newNode.no);
}
}
}
class HeroNode2{
public int no;//编号
public String name;//名字
public String nickName;//昵称
public HeroNode2 next;
public HeroNode2 pre;
//指向下一个节点
//todo 构造器
public HeroNode2(int no,String name,String nickName){
this.no=no;
this.name=name;
this.nickName=nickName;
}
//为了显示方便
@Override
public String toString(){
if(pre==null){
return "HeroNode2[no="+no+",name="+name+",nickName="+nickName+",next.no="+next.no+"]";
}else if(next==null){
return "HeroNode2[no="+no+",name="+name+",nickName="+nickName+",pre.no="+pre.no+"]";
}else{
return "HeroNode2[no="+no+",name="+name+",nickName="+nickName+",pre.no="+pre.no+",next.no="+next.no+"]";
}
}
}
尚硅谷Java数据结构--双向链表的增删查改
最新推荐文章于 2024-06-14 15:02:13 发布