双向链表
单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后遍历、
单向链表的缺点分析:
1)单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找
2)单项链表不能自我删除,需要靠辅助节点,而双向链表,可以自我删除
public class DoubleLinkedListDemo { public static void main(String[] args) { HeroNode2 node1 = new HeroNode2(1, "宋江", "及时雨"); HeroNode2 node2 = new HeroNode2(2, "卢俊义", "玉麒麟"); HeroNode2 node3 = new HeroNode2(3, "吴用", "智多星"); HeroNode2 node4 = new HeroNode2(4, "林冲", "豹子头"); DoubleLinkedList list = new DoubleLinkedList(); list.addByOrder(node2); list.addByOrder(node4); list.addByOrder(node3); list.addByOrder(node1); list.list(); //修改节点 System.out.println("================================="); HeroNode2 newNode = new HeroNode2(2, "庐州太太", "玉麒麟~~"); list.update(newNode); list.list(); //删除节点 System.out.println("================================="); list.delete(node4); list.list(); } } //定义一个LinkedList 来管理我们的英雄 class DoubleLinkedList{ //定义一个头节点,不存对象 private HeroNode2 head = new HeroNode2(0,"",""); // 添加节点 public void add(HeroNode2 hero){ HeroNode2 temp = head; while(true){ if(temp.next==null){ break; } temp=temp.next; } //形成一个双向链表 temp.next=hero; hero.pre=temp; } // 按照no的顺序添加节点 public void addByOrder(HeroNode2 hero){ HeroNode2 temp = head; boolean flag = false; //标志和添加的节点和链表中节点的编号没有重复 while(true){ if(temp.next==null){ break; } if(temp.next.no>hero.no){ break; }else if(temp.next.no==hero.no){ flag = true; break; } temp =temp.next; } //此时的temp要插入节点的前一个节点 if(temp.next!=null){ temp.next.pre=hero; hero.next=temp.next; } temp.next=hero; hero.pre=temp; } //单链表的修改 public void update(HeroNode2 hero){ if(head.next==null){ System.out.println("链表为空!!"); } HeroNode2 temp = head; boolean flag = false; //标志是否在链表中找到 no==hero.no 的节点 while(true){ if(temp.next==null){ break; } if(temp.next.no==hero.no){ flag=true; break; } temp=temp.next; } if(flag){ temp.next.name =hero.name; temp.next.nickName =hero.nickName; }else{ System.out.printf("未在链表中找到no为%d的节点",hero.no); } } //节点的删除 public void delete(HeroNode2 hero){ if(head.next==null){ System.out.println("链表为空!!"); } HeroNode2 temp = head.next; boolean flag = false; //标志是否在链表中找到待删除节点 while(true){ if(temp==null){ break; } if(temp.no==hero.no){ flag=true; break; } temp=temp.next; } if(flag){ temp.pre.next=temp.next; //删除节点 if(temp.next!=null){ temp.next.pre = temp.pre; } }else{ System.out.printf("no为%d的节点不存在",hero.no); } } //显示链表【遍历】 public void list(){ if(head.next==null){ System.out.println("链表为空!"); return; } HeroNode2 temp = head; while(true){ if(temp.next==null){ break; } temp=temp.next; System.out.println(temp); } } } //定义一个HeroNode,每个 HeroNode 就是一个节点 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 "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\''+'}' ; } }