国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

2020-06-24 11:36java教程網(wǎng) JAVA教程

這篇文章主要介紹了Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下

 鏈表是一種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),其數(shù)據(jù)之間的相互關(guān)系使鏈表分成三種:?jiǎn)捂湵怼⒀h(huán)鏈表、雙向鏈表,下面將逐一介紹。鏈表在數(shù)據(jù)結(jié)構(gòu)中是基礎(chǔ),也是重要的知識(shí)點(diǎn),這里講下Java 中鏈表的實(shí)現(xiàn),

JAVA 鏈表操作:?jiǎn)捂湵砗碗p鏈表

主要講述幾點(diǎn):

一、鏈表的簡(jiǎn)介

二、鏈表實(shí)現(xiàn)原理和必要性

三、單鏈表示例

四、雙鏈表示例

一、鏈表的簡(jiǎn)介 

  鏈表是一種比較常用的數(shù)據(jù)結(jié)構(gòu),鏈表雖然保存比較復(fù)雜,但是在查詢時(shí)候比較便捷,在多種計(jì)算機(jī)語言都相應(yīng)的應(yīng)用,鏈表有多種類別,文章針對(duì)單鏈表和雙鏈表進(jìn)行分析。鏈表中數(shù)據(jù)就像被一個(gè)鏈條串聯(lián)一起,輕易的可以實(shí)現(xiàn)數(shù)據(jù)的訪問。

二、鏈表實(shí)現(xiàn)原理和必要性

  這里只分析單鏈表和雙鏈表。鏈表的實(shí)現(xiàn)過程是有些許復(fù)雜的,但是會(huì)帶來許多好處。比如現(xiàn)在網(wǎng)購時(shí)代到來,商家發(fā)快遞一般會(huì)將商品包裝在盒子里并寫上地址信息,快遞公司就可以通過盒子上的信息找到買家,商品完整到達(dá)。如果沒有盒子的保護(hù),有可能在途中商品受損。而鏈表就好比那個(gè)寫了地址信息的盒子,既保護(hù)了商品信息,同時(shí)又寫好了物流信息。鏈表之中存在一個(gè)HEAD節(jié)點(diǎn),類似“火車頭”,只要找到相應(yīng)HEAD節(jié)點(diǎn),就可以對(duì)鏈表進(jìn)行操作。此次分析中,HEAD節(jié)點(diǎn)只是做數(shù)據(jù)頭,不保存有效數(shù)據(jù)。

  單鏈表的實(shí)現(xiàn)原理如圖:

Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

  雙鏈表實(shí)現(xiàn)原理:

Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

三、單鏈表示例  

ICommOperate<T> 接口操作類:

?
1
2
3
4
5
6
7
8
9
10
11
package LinkListTest;
import java.util.Map;
public interface ICommOperate<T> {
  
  public boolean insertNode(T node) ;
  public boolean insertPosNode(int pos, T node) ;
  public boolean deleteNode(int pos) ;
  public boolean updateNode(int pos, Map<String, Object> map) ;
  public T getNode(int pos, Map<String, Object> map) ;
  public void printLink() ;
}

單鏈表節(jié)點(diǎn):

?
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
package LinkListTest;
// 單連表節(jié)點(diǎn)
public class SNode {
  private String data;
  private SNode nextNode;
  public SNode() {
  }
  public SNode(String data) {
    this.data = data;
    this.nextNode = new SNode();
  }
  
  public String getData() {
    return data;
  }
  public void setData(String data) {
    this.data = data;
  }
  public SNode getNextNode() {
    return nextNode;
  }
  public void setNextNode(SNode nextNode) {
    this.nextNode = nextNode;
  }
  @Override
  public String toString() {
    return "SNode [data=" + data + "]";
  }
}

單鏈接操作類:

?
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
package LinkListTest;
import java.util.HashMap;
import java.util.Map;
public class SingleLinkList implements ICommOperate<SNode>{
  private SNode head = new SNode("HEAD") ; // 公共頭指針,聲明之后不變
  private int size = 0 ;
  public int getSize() {
    return this.size;
  }
 
  /*
   * 鏈表插入,每次往末端插入
   * */
  @Override
  public boolean insertNode(SNode node) {
    boolean flag = false ;
    SNode current = this.head ;
    if( this.size==0 ){ // 空鏈表
      this.head.setNextNode(node) ;
      node.setNextNode(null) ;
    }else{        // 鏈表內(nèi)節(jié)點(diǎn)
      while( current.getNextNode()!=null ){
        current = current.getNextNode() ;
      }
      current.setNextNode(node) ;
      node.setNextNode(null) ;
    }
    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() ;
    
    if( this.size==0 ){          // 空鏈表
      this.head.setNextNode(node) ;
      node.setNextNode(null) ;
      this.size++ ;
    }else if( this.size<pos ){      // pos位置大于鏈表長(zhǎng)度,插入末端
      insertNode(node) ;
    }else if( pos>0 && pos<=this.size) { // 鏈表內(nèi)節(jié)點(diǎn)
      // 1、找到要插入pos位置節(jié)點(diǎn)和前節(jié)點(diǎn)
      int find = 0;
      SNode preNode = this.head; // 前節(jié)點(diǎn)
      SNode currentNode = current; // 當(dāng)前節(jié)點(diǎn)
      while( find<pos-1 && currentNode.getNextNode()!=null ){
        preNode = current ;          // 前節(jié)點(diǎn)后移
        currentNode = currentNode.getNextNode() ; // 當(dāng)前節(jié)點(diǎn)后移
        find++ ;
      }
//      System.out.println(preNode);
//      System.out.println(currentNode);
      // 2、插入節(jié)點(diǎn)
      preNode.setNextNode(node);
      node.setNextNode(currentNode);
      this.size++ ;
      System.out.println("節(jié)點(diǎn)已經(jīng)插入鏈表中");
    }else{
      System.out.println("位置信息錯(cuò)誤");
      flag = false ;
    }
    
    return flag;
  }
  
  /*
   * 指定鏈表的節(jié)點(diǎn)pos,刪除對(duì)應(yīng)節(jié)點(diǎn)。方式:找到要?jiǎng)h除節(jié)點(diǎn)的前后節(jié)點(diǎn),進(jìn)行刪除。從1開始
   * */
  @Override
  public boolean deleteNode(int pos) {
    boolean flag = false;
    SNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==null ){
      System.out.println("位置信息錯(cuò)誤或鏈表無信息");
    }else{
      // 1、找到要?jiǎng)h除節(jié)點(diǎn)的前后節(jié)點(diǎn)
      int find = 0;
      SNode preNode = this.head; // 前節(jié)點(diǎn)
      SNode nextNode = current.getNextNode(); // 后節(jié)點(diǎn)
      while( find<pos-1 && nextNode.getNextNode()!=null ){
        preNode = current ;          // 前節(jié)點(diǎn)后移
        nextNode = nextNode.getNextNode() ; // 后節(jié)點(diǎn)后移
        find++ ;
      }
//      System.out.println(preNode);
//      System.out.println(nextNode);
      
      // 2、刪除節(jié)點(diǎn)
      preNode.setNextNode(nextNode);
      System.gc();
      this.size-- ;
      flag = true ;
    }
    
    return flag;
  }
 
  /*
   * 指定鏈表的節(jié)點(diǎn)pos,修改對(duì)應(yīng)節(jié)點(diǎn)。 從1開始
   * */
  @Override
  public boolean updateNode(int pos, Map<String, Object> map) {
    boolean flag = false ;
    SNode node = getNode(pos, map); // 獲得相應(yīng)位置pos的節(jié)點(diǎn)
    if( node!=null ){
      String data = (String) map.get("data") ;
      node.setData(data);
      flag = true ;
    }
    return flag;
  }
 
  /*
   * 找到指定鏈表的節(jié)點(diǎn)pos,從1開始
   * */
  @Override
  public SNode getNode(int pos, Map<String, Object> map) {
    SNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==null ){
      System.out.println("位置信息錯(cuò)誤或鏈表不存在");
      return null;
    }
    int find = 0 ;
    while( find<pos-1 && current!=null ){
      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() ;
    int find = 0 ;
    System.out.println("總共有節(jié)點(diǎn)數(shù): " + length +" 個(gè)");
    while( current!=null ){
      System.out.println("第 " + (++find) + " 個(gè)節(jié)點(diǎn) :" + current);
      current=current.getNextNode() ;
    }
  }
  
  public static void main(String[] args) {
    SingleLinkList sll = new SingleLinkList() ;
    SNode node1 = new SNode("節(jié)點(diǎn)1");
    SNode node2 = new SNode("節(jié)點(diǎn)2");
    SNode node3 = new SNode("節(jié)點(diǎn)3");
    SNode node4 = new SNode("節(jié)點(diǎn)4");
    SNode node5 = new SNode("節(jié)點(diǎn)5");
    SNode node6 = new SNode("插入指定位置");
    sll.insertPosNode(sll.getSize()+1, node1) ;
    sll.insertPosNode(sll.getSize()+1, node2) ;
    sll.insertPosNode(sll.getSize()+1, node3) ;
    sll.insertPosNode(sll.getSize()+1, node4) ;
    sll.insertPosNode(sll.getSize()+1, node5) ;
    
//    sll.insertNode(node1);
//    sll.insertNode(node2);
//    sll.insertNode(node3);
//    sll.insertNode(node4);
//    sll.insertNode(node5);
    
    System.out.println("*******************輸出鏈表*******************");
    sll.printLink();
    
    System.out.println("*******************獲得指定鏈表節(jié)點(diǎn)*******************");
    int pos = 2 ;
    System.out.println("獲取鏈表第 "+pos+" 個(gè)位置數(shù)據(jù) :"+sll.getNode(pos, null));
    
    System.out.println("*******************向鏈表指定位置插入節(jié)點(diǎn)*******************");
    int pos1 = 2 ;
    System.out.println("將數(shù)據(jù)插入第 "+pos1+" 個(gè)節(jié)點(diǎn):");
    sll.insertPosNode(pos1, node6) ;
    sll.printLink();
    
    System.out.println("*******************刪除鏈表指定位置節(jié)點(diǎn)*******************");
    int pos2 = 2 ;
    System.out.println("刪除第 "+pos2+" 個(gè)節(jié)點(diǎn):");
    sll.deleteNode(pos2) ;
    sll.printLink();
    
    System.out.println("*******************修改鏈表指定位置節(jié)點(diǎn)*******************");
    int pos3 = 2 ;
    System.out.println("修改第 "+pos3+" 個(gè)節(jié)點(diǎn):");
    Map<String, Object> map = new HashMap<>() ;
    map.put("data", "this is a test") ;
    sll.updateNode(pos3, map) ;
    sll.printLink();
  }
}

四、雙鏈表示例

ICommOperate<T> 接口操作類:

?
1
2
3
4
5
6
7
8
9
10
package LinkListTest;
import java.util.Map;
public interface ICommOperate<T> { 
  public boolean insertNode(T node) ;
  public boolean insertPosNode(int pos, T node) ;
  public boolean deleteNode(int pos) ;
  public boolean updateNode(int pos, Map<String, Object> map) ;
  public T getNode(int pos, Map<String, Object> map) ;
  public void printLink() ;
}

雙鏈表節(jié)點(diǎn):

?
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
package LinkListTest;
// 雙連表節(jié)點(diǎn)
public class DNode {
  private DNode priorNode;
  private String data;
  private DNode nextNode;
  
  public DNode(){
  }
  public DNode(String data) {
    this.priorNode = new DNode() ;
    this.data = data ;
    this.nextNode = new DNode() ;
  }
 
  public DNode getPriorNode() {
    return priorNode;
  }
  public void setPriorNode(DNode priorNode) {
    this.priorNode = priorNode;
  }
 
  public String getData() {
    return data;
  }
  public void setData(String data) {
    this.data = data;
  }
 
  public DNode getNextNode() {
    return nextNode;
  }
  public void setNextNode(DNode nextNode) {
    this.nextNode = nextNode;
  }
 
  @Override
  public String toString() {
    return "DNode [data=" + data + "]";
  
}

 雙鏈表實(shí)現(xiàn)類:

?
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
package LinkListTest;
import java.util.HashMap;
import java.util.Map;
public class DoubleLinkList implements ICommOperate<DNode>{
  private DNode head = new DNode("HEAD");
  private int size = 0 ;
  public int getSize() {
    return this.size;
  }
  
  /*
   * 鏈表插入,每次往末端插入
   * */
  @Override
  public boolean insertNode(DNode node) {
    boolean flag = false;
    
    DNode current = this.head ;
    if( this.size==0 ){ // 空鏈表
      this.head.setNextNode(node) ;
      node.setPriorNode(this.head);
      node.setNextNode(null) ;
    }else{        // 鏈表內(nèi)節(jié)點(diǎn)
      while( current.getNextNode()!=null ){
        current = current.getNextNode() ;
      }
      current.setNextNode(node);
      node.setNextNode(null);
      node.setPriorNode(current);
    }
    this.size++ ;
    flag = true ;
  
    return flag;
  }
  
  /*
   * 插入鏈表指定位置pos,從1開始,而pos大于size則插入鏈表末端
   * */
  @Override
  public boolean insertPosNode(int pos, DNode node) {
    boolean flag = true;
    
    DNode current = this.head.getNextNode() ;
    if( this.size==0){             // 鏈表為空
      this.head.setNextNode(node) ;
      node.setNextNode(null) ;
      node.setPriorNode(this.head);
      this.size++ ;
    }else if( pos>this.size ){         // pos位置大于鏈表長(zhǎng)度,插入末端
      insertNode(node) ;
    }else if( pos>0 && pos<=this.size ){  // 鏈表內(nèi)節(jié)點(diǎn)
      // 1、找到要插入位置pos節(jié)點(diǎn),插入pos節(jié)點(diǎn)當(dāng)前位置
      int find = 0;
      while( find<pos-1 && current.getNextNode()!=null ){
        current = current.getNextNode() ;
        find++ ;
      }
      // 2、插入節(jié)點(diǎn)
      if( current.getNextNode()==null ){ // 尾節(jié)點(diǎn)
        node.setPriorNode(current);
        node.setNextNode(null);
        current.setNextNode(node);
      } else if( current.getNextNode()!=null ) { //中間節(jié)點(diǎn)
        node.setPriorNode(current.getPriorNode());
        node.setNextNode(current);
        current.getPriorNode().setNextNode(node);
        current.setPriorNode(node);
      }
      this.size++ ;
    }else{
      System.out.println("位置信息錯(cuò)誤");
      flag = false ;
    }
    
    return flag;
  }
  
  /*
   * 指定鏈表的節(jié)點(diǎn)pos,刪除對(duì)應(yīng)節(jié)點(diǎn),從1開始
   * */
  @Override
  public boolean deleteNode(int pos) {
    boolean flag = false;
    DNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==null ){
      System.out.println("位置信息錯(cuò)誤或鏈表不存在");
    }else{
      // 1、找到要?jiǎng)h除位置pos節(jié)點(diǎn)
      int find = 0;
      while( find<pos-1 && current.getNextNode()!=null ){
        current = current.getNextNode() ;
        find++ ;
      }
      // 2、刪除節(jié)點(diǎn)
      if( current.getNextNode()==null ){ // 尾節(jié)點(diǎn)
        current.getPriorNode().setNextNode(null) ;
      } else if( current.getNextNode()!=null ) { //中間節(jié)點(diǎn)
        current.getPriorNode().setNextNode(current.getNextNode()) ;
        current.getNextNode().setPriorNode(current.getPriorNode()) ;
      }
      System.gc();
      this.size-- ;
      flag = true ;
    }
    return flag;
  }
 
  /*
   * 指定鏈表的節(jié)點(diǎn)pos,修改對(duì)應(yīng)節(jié)點(diǎn)。 從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;
  }
  
  /*
   * 找到指定鏈表的節(jié)點(diǎn)pos,從1開始
   * */
  @Override
  public DNode getNode(int pos, Map<String, Object> map) {
    DNode current = this.head.getNextNode() ;
    if( pos<=0 || pos>this.size || current==null ){
      System.out.println("位置信息錯(cuò)誤或鏈表不存在");
      return null;
    }
    int find = 0 ;
    while( find<pos-1 && current!=null ){
      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("總共有節(jié)點(diǎn)數(shù): " + length +" 個(gè)");
    while( current!=null ){
      System.out.println("第 " + (++find) + " 個(gè)節(jié)點(diǎn) :" + current);
      current=current.getNextNode() ;
    }
  }
  
  public static void main(String[] args) {
    DoubleLinkList dll = new DoubleLinkList() ;
    DNode node1 = new DNode("節(jié)點(diǎn)1");
    DNode node2 = new DNode("節(jié)點(diǎn)2");
    DNode node3 = new DNode("節(jié)點(diǎn)3");
    DNode node4 = new DNode("節(jié)點(diǎn)4");
    DNode node5 = new DNode("節(jié)點(diǎn)5");
    DNode node6 = new DNode("插入指定位置");
    dll.insertPosNode(10, node1) ;
    dll.insertPosNode(10, node2) ;
    dll.insertPosNode(10, node3) ;
    dll.insertPosNode(10, node4) ;
    dll.insertPosNode(10, node5) ;
//    dll.insertNode(node1);
//    dll.insertNode(node2);
//    dll.insertNode(node3);
//    dll.insertNode(node4);
//    dll.insertNode(node5);
    
    System.out.println("*******************輸出鏈表*******************");
    dll.printLink();
    
    System.out.println("*******************獲得指定鏈表節(jié)點(diǎn)*******************");
    int pos = 2 ;
    System.out.println("獲取鏈表第 "+pos+" 個(gè)位置數(shù)據(jù) :"+dll.getNode(pos, null));
    
    System.out.println("*******************向鏈表指定位置插入節(jié)點(diǎn)*******************");
    int pos1 = 2 ;
    System.out.println("將數(shù)據(jù)插入第"+pos1+"個(gè)節(jié)點(diǎn):");
    dll.insertPosNode(pos1, node6) ;
    dll.printLink();
    
    System.out.println("*******************刪除鏈表指定位置節(jié)點(diǎn)*******************");
    int pos2 = 7 ;
    System.out.println("刪除第"+pos2+"個(gè)節(jié)點(diǎn):");
    dll.deleteNode(pos2) ;
    dll.printLink();
    
    System.out.println("*******************修改鏈表指定位置節(jié)點(diǎn)*******************");
    int pos3 = 2 ;
    System.out.println("修改第"+pos3+"個(gè)節(jié)點(diǎn):");
    Map<String, Object> map = new HashMap<>() ;
    map.put("data", "this is a test") ;
    dll.updateNode(pos3, map) ;
    dll.printLink();
  }
}

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

延伸 · 閱讀

精彩推薦
515
主站蜘蛛池模板: 久草成人网 | 97视频久久久 | 亚洲 欧美 另类 综合 偷拍 | 黄色小视频在线免费观看 | 麻豆国产尤物av尤物在线观看 | 免费精品| 日韩小视频 | 久久精品成人 | 久久久久在线 | 亚洲精品久久久久久一区二区 | 久久久免费网站 | 九九热这里 | 在线日韩欧美 | 日韩一区二区三区在线视频 | av在线电影观看 | 自拍视频网站 | 欧美大片一区二区 | 国产精品久久久久久亚洲调教 | 日韩三级 | 91精选视频在线观看 | 日韩精品成人 | 日韩蜜桃 | 欧美三级在线 | 久久久久久久久久亚洲 | 欧美另类国产 | av久久 | 精品欧美乱码久久久久久1区2区 | www午夜视频 | 欧美一区二区三区电影 | 精品视频在线观看 | 涩涩一区 | 国产一区二区三区免费 | 国产啊v在线观看 | 免费一区 | 99精品国产高清一区二区麻豆 | 国产精品久久久久久亚洲调教 | 最新中文字幕在线 | 精产品自偷自拍 | 日韩精品极品视频在线观看免费 | 成人在线视频观看 | 91亚洲国产成人久久精品网站 |