package linkedList; public class DoubleLinkedListDemo { public static void main(String[] args) { // TODO Auto-generated method stub 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.add(hero1); doubleLinkedList.add(hero4); doubleLinkedList.add(hero3); doubleLinkedList.add(hero2); doubleLinkedList.list(); System.out.println("更新~~~~~~~~~~~~~~~~"); HeroNode2 hero5=new HeroNode2(4, "公孙胜", "入云龙"); doubleLinkedList.upDate(hero5); doubleLinkedList.list(); System.out.println("删除~~~~~~~~~~~~~~~~~"); doubleLinkedList.delNodeById(3); doubleLinkedList.list(); } } //定义双向链表节点 class DoubleLinkedList { private HeroNode2 head=new HeroNode2(0, "", ""); //遍历双向链表 public void list() { //先判断列表是否为空 if(head.next==null) { return; } //因为头结点不能动,因此需要一个辅助变量来变量 HeroNode2 temp=head.next; while(true) { if(temp==null)//如果为空 { break; } else { //输出节点的信息 System.out.println(temp); //将temp后移 temp=temp.next; } } } //添加 public void add(HeroNode2 heroNode) { //head节点不可以动,因此我们需要一个辅助遍历temp HeroNode2 temp=head; //遍历链表找到,找到最后 while(true) { //当什么情况下,说明链表带最后了 if(temp.next==null) { break; } //如果没有找到,就将指针后移 temp=temp.next; } //当到达了双向链表的最后 temp.next=heroNode; heroNode.pre=temp; } //删除一个节点 public void delNodeById(int id) { if(head.next==null) { System.out.println("链表为空,无法删除该节点!"); } else { HeroNode2 temp=head.next; boolean flag=false;//没有找到要删除的节点 while(true) { if(temp==null) { break; } if(temp.no==id) { flag=true;//说明找到了 break; } temp=temp.next; } if(flag) { if(temp.next==null) { temp.pre.next=temp.next; } else { temp.pre.next=temp.next; temp.next.pre=temp.pre;//这里代码存在问题,如果是最后一个节点不应该出现这句话,否则会出现空指针异常 } } else { System.out.println("没有找到要删除的节点!"); } } } //更新链表 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)//到了链表的最后 { break; } if(temp.no==newHeroNode.no) { flag=true; break; } temp=temp.next; } //根据flag来判断是否找到要修改的节点 if(flag) { temp.name=newHeroNode.name; temp.nickName=newHeroNode.nickName; } else//没有找到 { System.out.printf("没有找到编号%d的节点,不能修改!",newHeroNode.no); } } //按照顺序来添加英雄 //第二种添加英雄的方法通过id的顺序来添加英雄 public void addByOrder(HeroNode2 heroNode) { //由于头结点不能用,依旧通过一个辅助节点来进行插入遍历 //要找的temp是添加位置的前一个节点 HeroNode2 temp=head; boolean flag=false;//添加编号是否存在,默认为false while(true) { if(temp.next==null)//说明已经到最后 { break; } if(temp.next.no>heroNode.no)//插入的位置找到了,就在temp的后面插入 { break; } else if(temp.next.no==heroNode.no) { flag=true; break; } temp=temp.next;//后移,也就是 } //判断flag的值 if(flag)//说明编号已经存在,不能在添加 { System.out.printf("准备插入的英雄编号%d已经存在! ",heroNode.no); } else { //插入到链表中 heroNode.next=temp.next; heroNode.pre=temp; temp.next.pre=heroNode; temp.next=heroNode; } } } //定义一个HeroNode,每个HeroNode对象就是一个节点 class HeroNode2 { public int no; public String name; public String nickName; public HeroNode2 next;//指向下一个节点,初始化为null public HeroNode2 pre;//指向前一个节点,初始化为null //构造器 public HeroNode2(int no,String name,String nickName) { this.no=no; this.nickName=nickName; this.name=name; } //为了显示方便,重写toString方法 @Override public String toString() { return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName+ "]"; } }