1 /*双向链表特点:
2 *1.每个节点含有两个引用,previos和next,支持向前或向后的遍历(除头节点)
3 *2.缺点插入或删除的时候涉及到引用修改的比较多
4 *注意:下面的双向链表其实也实现了双端链表
5 *注意:在Java中多个引用可以指向同一个对象,也可以随时改变引用的指向
6 * 关于修改引用细心一点就可以 引用A = 引用B 表示A引用指向B引用指向的对象
7 *应用:利用双向链表可以实现双端队列
8 * */
9
10 public class MyDoubleLink {
11 private Link first;
12 private Link last;
13
14 public boolean isEmpty(){
15 return first == null;
16 }
17
18 public void insertFirst(int key){
19 Link newLink = new Link(key);
20 if(first == null){
21 last = newLink;
22 }
23 else{
24 first.previous = newLink;
25 }
26 newLink.next = first;//链未断可以指向同一个
27 first = newLink;
28 }
29
30 public void insertLast(int key){
31 Link newLink = new Link(key);
32 if(first == null){
33 first = newLink;
34 }
35 else{
36 last.next = newLink;
37 newLink.previous = last;
38 }
39 last = newLink;
40 }
41
42 //插入指定值的后边---其实是一种尾巴插入--此时链表非空才可以操作
43 public boolean insertAfter(int key,int value){
44 Link newLink = new Link(value);
45 Link current = first;
46 while(current.id != key){
47 current = current.next;
48 if(current == null){
49 return false;
50 }
51 }
52 if(current == last){//find it at last item
53 newLink.next = null;
54 last = newLink;
55 }
56 else{
57 newLink.next = current.next;
58 current.next.previous = newLink;
59 }
60 newLink.previous = current;
61 current.next = newLink;
62 return true;
63 }
64
65 public Link deleteFirst(){
66 Link temp = first;
67 if(first.next == null){
68 last = null;
69 }
70 else{
71 first.next.previous = null;
72 }
73 first = first.next;
74 return temp;
75 }
76
77 public Link deleteLast(){
78 Link temp = last;
79 if(first.next == null){
80 first = null;
81 }
82 else{
83 last.previous.next = null;
84 }
85 last = last.previous;
86 return temp;
87 }
88
89 //按照值进行删除--可能存在找不到的时候
90 public Link delete(int key){
91 Link current = first;
92 while(current.id != key ){
93 current = current.next;
94 if(current == null){
95 return null;
96 }
97 }
98 if(current == first){//find it at first item并非只有一个节点
99 first = current.next;
100 }
101 else{ //find it not first item
102 current.previous.next = current.next;
103 }
104
105 if(current == last){ //find it at last item
106 last = current.previous;
107 }
108 else{ //find it not last
109 current.next.previous = current.previous;
110 }
111 return current;
112 }
113
114 public void diaplayFirstToLast(){
115 System.out.println("first to last");
116 Link current = first;
117 while(current != null){
118 System.out.print(current.id + " ");
119 current = current.next;
120 }
121 System.out.println();
122 }
123
124 public void displayLastToFirst(){
125 System.out.println("last to first");
126 Link current = last;
127 while(current != null){
128 System.out.print(current.id + " ");
129 current = current.previous;
130 }
131 System.out.println();
132 }
133 }