package com.dai.linkedList; import javax.lang.model.element.NestingKind; 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 doubeLinkedList = new DoubleLinkedList(); doubeLinkedList.add(hero1); doubeLinkedList.add(hero2); doubeLinkedList.add(hero3); doubeLinkedList.add(hero4); doubeLinkedList.list(); //修改 HeroNode2 newHeroNode = new HeroNode2(4, "公孙胜", "入云龙"); doubeLinkedList.update(newHeroNode); System.out.println("修改后的链表:"); doubeLinkedList.list(); //删除 doubeLinkedList.delete(3); System.out.println("删除后的"); doubeLinkedList.list(); //按顺序插入 HeroNode2 hero5 = new HeroNode2(3,"测试", "测试昵称"); doubeLinkedList.addByOrder(hero5); System.out.println("按顺序插入:"); doubeLinkedList.list(); } } class DoubleLinkedList{ private HeroNode2 head = new HeroNode2(0, null, null); //返回头结点 public HeroNode2 getHead() { return 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 flag = false; while(true) { if(temp.next==null) { break; } if(temp.next.no > heroNode.no) { break; } else if (temp.next.no == heroNode.no) { flag = true; break; } temp = temp.next; } if(flag==true) { System.out.println("英雄编号存在,非法插入"); return; } if(temp.next == null) { temp.next = heroNode; heroNode.pre = temp; } else { heroNode.pre = temp; heroNode.next = temp.next; temp.next.pre = heroNode; temp.next = heroNode; } } //修改一个节点的内容 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; } if(flag) { temp.name = newHeroNode.name; temp.nickname = newHeroNode.nickname; } else { System.out.printf("没有找到编号%d的节点 ", newHeroNode.no); } } //双向链表可以直接找到要删除了节点,找到后自我删除即可 public void delete(int no) { //判断当前链表是否空 if(head.next==null) { System.out.println("链表空,无法删除"); return; } HeroNode2 temp = head; //辅助指针 boolean flag = false; //标识节点 while (true) { if(temp == null) { break; } if(temp.no==no) { flag = true; break; } temp = temp.next; } if(flag == true) { 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 nickname; public HeroNode2 next; public HeroNode2 pre; public HeroNode2(int no, String name, String nickname) { this.no = no; this.name = name; this.nickname = nickname; } @Override public String toString() { return "HeroNode2 [no=" + no + ", name=" + name + ", nickname=" + nickname + "]"; } }