一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - JAVA 數據結構鏈表操作循環鏈表

JAVA 數據結構鏈表操作循環鏈表

2020-06-24 11:38lqh JAVA教程

這篇文章主要介紹了JAVA 數據結構鏈表操作循環鏈表的相關資料,需要的朋友可以參考下

JAVA 鏈表操作:循環鏈表

主要分析示例:

一、單鏈表循環鏈表

二、雙鏈表循環鏈表

其中單鏈表節點和雙鏈表節點類和接口ICommOperate<T>與上篇一致,這里不在贅述。參考:JAVA鏈表操作:單鏈表和雙鏈表http://m.ythuaji.com.cn/article/78976.html

一、單鏈表循環鏈表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
package LinkListTest;
 
import java.util.HashMap;
import java.util.Map;
 
public class SingleCycleLinkList implements ICommOperate<SNode> {
  private SNode head = new SNode("HEAD") ; // 公共頭指針,聲明之后不變
  private int size = 0 ;
  public int getSize() {
    return this.size;
  }
  
  /*
   * 鏈表插入,每次往末端插入,判定末端的標準為next是否指向head
   * */
  @Override
  public boolean insertNode(SNode node) {
    boolean flag = false ;
    
    initLinkList() ; // 初始化鏈表
    if( this.size==0 ){ // 空鏈表
      this.head.setNextNode(node) ;
      node.setNextNode(this.head) ;
    }else{
      SNode current = this.head ;
      while( current.getNextNode()!=this.head ){ // 找到末端節點
        current = current.getNextNode() ;
      }
      current.setNextNode(node) ;
      node.setNextNode(this.head) ; // 循壞鏈表,尾節點指向head
    }
    this.size++ ;
    flag = true ;
    
    return flag;
  }
  
  /*
   * 插入鏈表指定位置pos,從1開始,而pos大于size則插入鏈表末端
   * */
  @Override
  public boolean insertPosNode(int pos, SNode node) {
    boolean flag = true ;
    SNode current = this.head.getNextNode() ;
    
    initLinkList() ;// 初始化鏈表
    if( this.size==0 ){         // 鏈表為空
      this.head.setNextNode(node) ;
      node.setNextNode(this.head) ;// 循壞鏈表,尾節點指向head
      this.size++ ;
    }else if( this.size<pos ){      // pos位置大于鏈表長度,插入末端
      insertNode(node) ;
    }else if( pos>0 && pos<=this.size ){ // 鏈表內節點
      // 1、找到要插入pos位置節點和前節點,node將插入兩個節點之間
      int find = 0;
      SNode preNode = this.head; // 前節點
      SNode currentNode = current; // 當前節點
      while( find<pos-1 && currentNode!=this.head ){
        preNode = current ;             // 前節點后移
        currentNode = currentNode.getNextNode() ; // 當前節點后移
        find++ ;
        if( find<pos-1 && currentNode!=this.head ){ // 未結束尋找節點前,后移前節點
          current = current.getNextNode() ;
        }
      }
//      System.out.println(preNode);
//      System.out.println(currentNode);
      
      // 2、插入節點
      preNode.setNextNode(node);
      node.setNextNode(currentNode);
      this.size++ ;
    }else {
      System.out.println("位置信息錯誤");
      flag = false ;
    }
    
    return flag;
  }
 
  private void initLinkList(){
    if( size==0 ){
      this.head.setNextNode(this.head);
    }
  }
  
  /*
   * 指定鏈表的節點pos,刪除對應節點。方式:找到要刪除節點的前后節點,進行刪除,下標從1開始
   * */
  @Override
  public boolean deleteNode(int pos) {
    boolean flag = false;
    SNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==this.head ){
      System.out.println("位置信息錯誤或鏈表無信息");
    }else{
      // 1、找到要刪除節點的前后節點
      int find = 0;
      SNode preNode = this.head; // 前節點
      SNode nextNode = current.getNextNode(); // 后節點
      while( find<pos-1 && nextNode!=this.head ){
        preNode = current ;          // 前節點后移
        nextNode = nextNode.getNextNode() ; // 后節點后移
        find++ ;
        if( find<pos-1 && nextNode!=this.head ){ // 未結束找節點前,后移"前節點"
          current = current.getNextNode() ;
        }
      }
//      System.out.println(preNode);
//      System.out.println(nextNode);
      
      // 2、刪除節點
      preNode.setNextNode(nextNode);
      System.gc(); // 回收刪除節點
      this.size-- ;
      flag = true ;
    }
    
    return flag;
  }
  
  /*
   * 指定鏈表的節點pos,修改對應節點,下標從1開始
   * */
  @Override
  public boolean updateNode(int pos, Map<String, Object> map) {
    boolean flag = false ;
    SNode node = getNode(pos, map); // 獲得相應位置pos的節點
    if( node!=null ){
      String data = (String) map.get("data") ;
      node.setData(data);
      flag = true ;
    }
    return flag;
  }
  
  /*
   * 找到指定鏈表的節點pos,下標從1開始
   * */
  @Override
  public SNode getNode(int pos, Map<String, Object> map) {
    SNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==this.head ){
      System.out.println("位置信息錯誤或鏈表不存在");
      return null;
    }
    int find = 0 ;
    while( find<pos-1 && current!=this.head ){
      current = current.getNextNode() ;
      find++ ;
    }
    return current;
  }
 
  /*
   * 打印鏈表
   * */
  @Override
  public void printLink() {
    int length = this.size ;
    if( length==0 ){
      System.out.println("鏈表為空!");
      return ;
    }
    SNode current = this.head.getNextNode() ;
    System.out.println("總共有節點數: " + length +" 個");
    int find = 0 ;
    while( current!=this.head ){
      System.out.println("第 " + (++find) + " 個節點 :" + current);
      current=current.getNextNode() ;
    }
  }
  
  public static void main(String[] args) {
    SingleCycleLinkList scll = new SingleCycleLinkList() ;
    SNode node1 = new SNode("節點1");
    SNode node2 = new SNode("節點2");
    SNode node3 = new SNode("節點3");
    SNode node4 = new SNode("節點4");
    SNode node5 = new SNode("節點5");
    SNode node6 = new SNode("插入指定位置");
//    scll.insertPosNode(scll.getSize()+1, node1) ;
//    scll.insertPosNode(scll.getSize()+1, node2) ;
//    scll.insertPosNode(scll.getSize()+1, node3) ;
//    scll.insertPosNode(scll.getSize()+1, node4) ;
//    scll.insertPosNode(scll.getSize()+1, node5) ;
    scll.insertNode(node1);
    scll.insertNode(node2);
    scll.insertNode(node3);
    scll.insertNode(node4);
    scll.insertNode(node5);
    
    System.out.println("*******************輸出鏈表*******************");
    scll.printLink();
    
    System.out.println("*******************獲得指定鏈表節點*******************");
    int pos = 2 ;
    System.out.println("獲取鏈表第 "+pos+" 個位置數據 :"+scll.getNode(pos, null));
    
    System.out.println("*******************向鏈表指定位置插入節點*******************");
    int pos1 = 3 ;
    System.out.println("將數據插入第"+pos1+"個節點:");
    scll.insertPosNode(pos1, node6) ;
    scll.printLink();
    
    System.out.println("*******************刪除鏈表指定位置節點*******************");
    int pos2 = 3 ;
    System.out.println("刪除第"+pos2+"個節點:");
    scll.deleteNode(pos2) ;
    scll.printLink();
    
    System.out.println("*******************修改鏈表指定位置節點*******************");
    int pos3 = 3 ;
    System.out.println("修改第"+pos3+"個節點:");
    Map<String, Object> map = new HashMap<>() ;
    map.put("data", "this is a test") ;
    scll.updateNode(pos3, map) ;
    scll.printLink();
  }
 
}

 二、雙鏈表循環鏈表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package LinkListTest;
 
import java.util.HashMap;
import java.util.Map;
 
public class DoubleCycleLinkList implements ICommOperate<DNode>{
  private DNode head = new DNode("HEAD"); // 公共頭指針,聲明之后不變
  private int size = 0 ; // 記錄鏈表節點數量
  
  public int getSize() {
    return this.size;
  }
  
  /*
   * 鏈表插入,每次往末端插入,判定末端的標準為next是否指向head
   * */
  @Override
  public boolean insertNode(DNode node) {
    boolean flag = false ;
    
    initLinkList() ; // 初始化鏈表
    DNode current = this.head ;
    if( this.size==0 ){  // 空鏈表
      this.head.setNextNode(node) ;
      node.setPriorNode(this.head);
      node.setNextNode(this.head) ;
    }else{        // 鏈表內節點
      while( current.getNextNode()!=this.head ){ // 找到末端節點
        current = current.getNextNode() ;
      }
      current.setNextNode(node) ;
      node.setPriorNode(current);
      node.setNextNode(this.head) ; // 循壞鏈表,尾節點指向head
    }
    this.size++ ;
    flag = true ;
    
    return flag;
  }
  
  /*
   * 插入鏈表指定位置pos,從1開始,而pos大于size則插入鏈表末端
   * */
  @Override
  public boolean insertPosNode(int pos, DNode node) {
    boolean flag = true;
    
    initLinkList() ; // 初始化鏈表
    DNode current = this.head.getNextNode() ;
    if( this.size==0 ){           // 鏈表為空
      this.head.setNextNode(node) ;
      node.setPriorNode(this.head);
      node.setNextNode(this.head) ;
      this.size++ ;
    }else if( pos>this.size ){         // pos位置大于鏈表長度,插入末端
      insertNode(node) ;
    }else if( pos>0 && pos<=this.size ){  // 鏈表內節點
      // 1、找到要插入位置pos節點,插入pos節點當前位置
      int find = 0;
      while( find<pos-1 && current.getNextNode()!=this.head ){
        current = current.getNextNode() ;
        find++ ;
      }
      // 2、插入節點
      if( current.getNextNode()==this.head ){ // 尾節點
        node.setPriorNode(current);
        node.setNextNode(this.head);
        current.setNextNode(node);
      } else if( current.getNextNode()!=this.head ) { //中間節點
        node.setPriorNode(current.getPriorNode());
        node.setNextNode(current);
        current.getPriorNode().setNextNode(node);
        current.setPriorNode(node);
      }
      this.size++ ;
    }else{
      System.out.println("位置信息錯誤");
      flag = false ;
    }
    return flag;
  }
 
  private void initLinkList(){
    if( size==0 ){
      this.head.setNextNode(this.head);
      this.head.setPriorNode(this.head);
    }
  }
  
  /*
   * 指定鏈表的節點pos,刪除對應節點。方式:找到要刪除節點的前后節點刪除,下標從1開始
   * */
  @Override
  public boolean deleteNode(int pos) {
    boolean flag = false;
    DNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==this.head ){
      System.out.println("位置信息錯誤或鏈表不存在");
    }else{
      // 1、找到要刪除位置pos節點
      int find = 0;
      while( find<pos-1 && current.getNextNode()!=this.head ){
        current = current.getNextNode() ;
        find++ ;
      }
      // 2、刪除節點
      if( current.getNextNode()==this.head ){ // 尾節點
        current.getPriorNode().setNextNode(this.head) ;
      } else if( current.getNextNode()!=this.head ) { //中間節點
        current.getPriorNode().setNextNode(current.getNextNode()) ;
        current.getNextNode().setPriorNode(current.getPriorNode()) ;
      }
      System.gc(); // 回收刪除節點
      this.size-- ;
      flag = true ;
    }
    return flag;
  }
  
  /*
   * 指定鏈表的節點pos,修改對應節點,下標從1開始
   * */
  @Override
  public boolean updateNode(int pos, Map<String, Object> map) {
    boolean flag = false ;
    DNode node = getNode(pos, map);
    if( node!=null ){
      String data = (String) map.get("data") ;
      node.setData(data);
      flag = true ;
    }
    return flag;
  }
 
  /*
   * 找到指定鏈表的節點pos,下標從1開始
   * */
  @Override
  public DNode getNode(int pos, Map<String, Object> map) {
    DNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==this.head ){
      System.out.println("位置信息錯誤或鏈表不存在");
      return null;
    }
    int find = 0 ;
    while( find<pos-1 && current!=this.head ){
      current = current.getNextNode() ;
      find++ ;
    }
    return current;
  }
 
  /*
   * 打印鏈表
   * */
  @Override
  public void printLink() {
    int length = this.size ;
    if( length==0 ){
      System.out.println("鏈表為空!");
      return ;
    }
    DNode current = this.head.getNextNode() ;
    int find = 0 ;
    System.out.println("總共有節點數: " + length +" 個");
    while( current!=this.head ){
      System.out.println("第 " + (++find) + " 個節點 :" + current);
      current=current.getNextNode() ;
    }
  }
  
  public static void main(String[] args) {
    DoubleCycleLinkList dcll = new DoubleCycleLinkList() ;
    DNode node1 = new DNode("節點1");
    DNode node2 = new DNode("節點2");
    DNode node3 = new DNode("節點3");
    DNode node4 = new DNode("節點4");
    DNode node5 = new DNode("節點5");
    DNode node6 = new DNode("插入指定位置");
    dcll.insertPosNode(10, node1) ;
    dcll.insertPosNode(10, node2) ;
    dcll.insertPosNode(8, node3) ;
    dcll.insertPosNode(88, node4) ;
    dcll.insertPosNode(8, node5) ;
//    dcll.insertNode(node1);
//    dcll.insertNode(node2);
//    dcll.insertNode(node3);
//    dcll.insertNode(node4);
//    dcll.insertNode(node5);
    
    System.out.println("*******************輸出鏈表*******************");
    dcll.printLink();
    
    System.out.println("*******************獲得指定鏈表節點*******************");
    int pos = 2 ;
    System.out.println("獲取鏈表第 "+pos+"個位置數據 :"+dcll.getNode(pos, null));
    
    System.out.println("*******************向鏈表指定位置插入節點*******************");
    int pos1 = dcll.getSize()+1 ;
    System.out.println("將數據插入第"+pos1+"個節點:");
    dcll.insertPosNode(pos1, node6) ;
    dcll.printLink();
    
    System.out.println("*******************刪除鏈表指定位置節點*******************");
    int pos2 = 7 ;
    System.out.println("刪除第"+pos2+"個節點:");
    dcll.deleteNode(pos2) ;
    dcll.printLink();
    
    System.out.println("*******************修改鏈表指定位置節點*******************");
    int pos3 = 3 ;
    System.out.println("修改第"+pos3+"個節點:");
    Map<String, Object> map = new HashMap<>() ;
    map.put("data", "this is a test") ;
    dcll.updateNode(pos3, map) ;
    dcll.printLink();
  }
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产伦精品一区二区三区女 | 香蕉久草在线 | 免费在线观看亚洲 | 嫩草成人影院 | chinaspanking调教| 极品丝袜老师h系列全文阅读 | 午夜综合 | 乌克兰粉嫩摘花第一次 | 国产91影院 | 黑人好大好硬好深好爽想要h | 欧美国产日产精品免费视频 | www.国产自拍 | 亚洲视频在线免费看 | 欧美a级v片在线观看一区 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 欧美男人的天堂 | 日韩欧美中文字幕一区二区三区 | 99热国产这里只有精品 | ts人妖国产一区 | 亚洲国产在线播放在线 | 97影院秋霞国产精品 | 羞羞视频免费观看网站 | 91短视频在线免费观看 | 欧美肥b| 女女性恋爱免费 | 我与肥熟老妇的性事 | 嫩草研究 | 好男人资源免费观看 | 亚洲午夜小视频 | 爱爱小说漫画 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 美女艹b | 国产999在线观看 | 亚洲好骚综合 | 国产不卡视频一区二区在线观看 | 久久精品国产亚洲AV天美18 | 欧亚精品一区二区三区 | 婷婷99视频精品全部在线观看 | 幻女free性俄罗斯第一次摘花 | 亚洲精品国产自在现线最新 | 亚洲成人看片 |