数据结构 -线性结构 ->双向链表
双向链表:就是在单向链表的基础上加了一个pre(指向该节点的前一个节点)域,其他的没有改变,在对链表进行增删相关操作时在单向链表的基础上多以一个向前节点连接的动作即可。
因为有了指向前一个节点域,所以双向在查找数据上比单向的速度要快。
1 /** 2 * 双向链表 3 */ 4 class DoubleLinkedList { 5 private StartNode2 head = new StartNode2(0, " ", ""); 6 7 public StartNode2 getHead() { 8 return head; 9 } 10 11 /** 12 * 双向链表按照顺序添加数据 13 */ 14 public void addByOder(StartNode2 startNode2) { 15 StartNode2 temp = head; 16 boolean flag = false; 17 //循环链表,分别找到中间添加数据的标签和末端添加数据的标签 18 while (true) { 19 if (temp.next == null) { 20 break;//添加结束 21 } 22 if (temp.next.no > startNode2.no) { 23 break; 24 //链表中按顺序添加数据 25 } 26 if (temp.next.no == startNode2.no) { 27 flag = true;//添加数据有重复 28 break; 29 } 30 temp = temp.next; 31 } 32 if (flag) { 33 System.out.println("添加数据已有"); 34 } else { 35 if (temp.next != null) { 36 temp.next.pre = startNode2;//节点的前后指向有顺序要求,不同的顺序导致结果不一样,要先将插入节点与被比较节点的位置互换,再连接前节点 37 startNode2.next = temp.next; 38 temp.next = startNode2; 39 startNode2.pre = temp; 40 } else { 41 temp.next = startNode2;//添加数据为链表最后 42 startNode2.pre = temp; 43 } 44 } 45 } 46 47 /** 48 * 双向链表添加数据,与单向链表差不多,需要在添加的数据上比单向多一个pre 49 */ 50 public void add(StartNode2 startNode2) { 51 StartNode2 temp = head; 52 while (temp.next != null) { 53 temp = temp.next; 54 } 55 temp.next = startNode2; 56 startNode2.pre = temp; 57 } 58 59 /** 60 * 显示链表,与单向链表相同 61 */ 62 public void showList() { 63 if (head.next == null) { 64 System.out.println("链表为空~"); 65 return; 66 } 67 StartNode2 temp = head.next; 68 while (temp != null) { 69 System.out.println(temp); 70 temp = temp.next; 71 } 72 } 73 74 /** 75 * 修改双向链表中的数据,与单向链表的修改数据方式相同 76 */ 77 public void update(StartNode2 startNode2) { 78 if (head.next == null) { 79 System.out.println("链表为空!"); 80 return; 81 } 82 boolean flag = false; 83 StartNode2 temp = head; 84 while (temp.next != null) { 85 if (temp.next.no == startNode2.no) { 86 flag = true; 87 break;//找到 88 } 89 temp = temp.next; 90 } 91 if (flag) { 92 temp.next.name = startNode2.name; 93 temp.next.nickName = startNode2.nickName; 94 } else { 95 System.out.println("没有修改"); 96 } 97 } 98 99 /** 100 * 删除双向链表中的数据,与单向不同 101 * 单向需要找到被删除节点的前一个节点 102 * 双向链表则不同,只需要将需要删除的节点自身next,pre修改即可 103 */ 104 public void delete(int num) { 105 if (head.next == null) { 106 System.out.println("链表为空!"); 107 return; 108 } 109 boolean flag = false; 110 StartNode2 temp = head.next; 111 while (true) { 112 if (temp == null) { 113 break; 114 } 115 if (temp.no == num) { 116 flag = true; 117 break; 118 } 119 temp = temp.next; 120 } 121 if (flag) { 122 temp.pre.next = temp.next;//被删除数据的前一个数直接指向后一个,该数没有被指向,直接被jvm垃圾回收机制处理 123 if (temp.next != null) { 124 temp.next.pre = temp.pre; 125 } 126 System.out.printf("no为%d的数据已删除\n", num); 127 } else { 128 System.out.println("未找到数据,无删除"); 129 } 130 131 } 132 } 133 134 class StartNode2 { 135 int no; 136 String name; 137 String nickName; 138 StartNode2 next; 139 StartNode2 pre; 140 141 public StartNode2(int no, String name, String nickName) { 142 this.no = no; 143 this.name = name; 144 this.nickName = nickName; 145 } 146 147 @Override 148 public String toString() { 149 return "StartNode{" + 150 "no=" + no + 151 ", name='" + name + '\'' + 152 ", nickName='" + nickName + '\'' + 153 '}'; 154 } 155 }

浙公网安备 33010602011771号