数据结构--双链表
1) 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
2) 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到 temp,temp 是待删除节点的前一个节点.
1、遍历:
1) 遍历 和 单链表一样,只是可以向前,也可以向后查找
2、添加 (默认添加到双向链表的最后)
(1) 先找到双向链表的最后这个节点
(2) temp.next = newHeroNode
(3) newHeroNode.pre = temp;
3、修改 思路和 原来的单向链表一样.
4、删除
(1) 因为是双向链表,因此,我们可以实现自我删除某个节点
(2) 直接找到要删除的这个节点,比如 temp
(3) temp.pre.next = temp.next
(4) temp.next.pre = temp.pre;(需要判断是否是最后一个节点,不然会报空指针异常)
三、代码
1 package domain; 2 3 4 //双向链表节点 5 public class DoubleHeroNode { 6 public Integer no; 7 public String name; 8 public String nickName; 9 public DoubleHeroNode nextNode; 10 public DoubleHeroNode preNode; 11 12 public DoubleHeroNode() { 13 } 14 15 public DoubleHeroNode(Integer no, String name, String nickName) { 16 this.no = no; 17 this.name = name; 18 this.nickName = nickName; 19 } 20 21 @Override 22 public String toString() { 23 return "HeroNode{" + 24 "no=" + no + 25 ", name='" + name + '\'' + 26 ", nickName='" + nickName + '\'' + 27 '}'; 28 } 29 }
1 package serve; 2 3 import domain.DoubleHeroNode; 4 import domain.HeroNode; 5 6 public class DoubleLinkListServe { 7 DoubleHeroNode headNode = new DoubleHeroNode(); 8 9 //遍历双向链表 10 public void printList(){ 11 DoubleHeroNode tempNode = headNode; 12 if(tempNode.nextNode == null){ 13 System.out.println("空链表"); 14 return; 15 } 16 while(true){ 17 if(tempNode.nextNode == null){ 18 break; 19 } 20 System.out.println(tempNode.nextNode); 21 tempNode = tempNode.nextNode; 22 } 23 } 24 25 //在尾部添加 26 public void addNode(DoubleHeroNode newNode){ 27 DoubleHeroNode tempNode = headNode; 28 //遍历找到最后一个节点 29 while (tempNode.nextNode != null) { 30 tempNode = tempNode.nextNode; 31 } 32 tempNode.nextNode = newNode; 33 newNode.preNode = tempNode; 34 } 35 36 //根据no删除 37 public void delNode(int no){ 38 DoubleHeroNode tempNode = headNode; 39 //找到标识 40 boolean flag = false; 41 if(tempNode.nextNode == null){ 42 System.out.println("空链表"); 43 return; 44 } 45 while(true){ 46 if(tempNode.nextNode == null){ 47 break; 48 } 49 if(tempNode.nextNode.no == no){ 50 flag = true; 51 tempNode = tempNode.nextNode; 52 break; 53 } 54 tempNode = tempNode.nextNode; 55 } 56 if(flag){ 57 tempNode.preNode.nextNode = tempNode.nextNode; 58 // 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针 59 if(tempNode.nextNode != null){ 60 tempNode.nextNode.preNode= tempNode.preNode; 61 } 62 }else { 63 System.out.println("未找到该编号的节点"); 64 } 65 } 66 67 }
1 public class DoubleLinkListDemo { 2 public static void main(String[] args) { 3 DoubleLinkListServe doubleLinkListServe = new DoubleLinkListServe(); 4 5 DoubleHeroNode heroNode1 = new DoubleHeroNode(1,"宋江","及时雨"); 6 DoubleHeroNode heroNode2 = new DoubleHeroNode(2,"卢俊义","玉麒麟"); 7 DoubleHeroNode heroNode3 = new DoubleHeroNode(3,"吴用","智多星"); 8 DoubleHeroNode heroNode4 = new DoubleHeroNode(4,"林冲","豹子头"); 9 10 //添加节点 11 doubleLinkListServe.addNode(heroNode1); 12 doubleLinkListServe.addNode(heroNode2); 13 doubleLinkListServe.addNode(heroNode3); 14 doubleLinkListServe.addNode(heroNode4); 15 //遍历节点 16 doubleLinkListServe.printList(); 17 18 19 //删除节点 20 doubleLinkListServe.delNode(3); 21 //遍历节点 22 doubleLinkListServe.printList(); 23 24 } 25 }