雙向鏈表是一個基本的數據結構,在Java中LinkedList已經實現了這種結構,不過作為開發者,也要擁有自己顯示這種結構的能力。話不多說,上代碼:
首先是鏈表的節點類:
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
|
/** * 鏈表節點 * @author Administrator * * @param <T> */ public class ChainNode<T> { private T data; //對象編號 private int dataNo; public ChainNode<T> nextChainNode; public ChainNode<T> preChainNode; public ChainNode(T data, ChainNode<T> nextChainNode, ChainNode<T> preChainNode) { this .data = data; this .nextChainNode = nextChainNode; this .preChainNode = preChainNode; } public ChainNode(T data) { this .data = data; } public int getDataNo() { return dataNo; } public void setDataNo( int dataNo) { this .dataNo = dataNo; } public void setData(T data) { this .data = data; } public T getData() { return 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
|
<pre name= "code" class = "java" > /** * 鏈表實現類 * @author Administrator * * @param <T> */ public class Chain<T> { //頭節點 private ChainNode<T> headNode; //末尾節點指針 private ChainNode<T> lastNode; private int size; //創建鏈表就創建頭節點 public Chain() { this .headNode = new ChainNode<T>( null ); this .lastNode = headNode; } //增加一個節點 public void addNode(T data) { ChainNode<T> node = new ChainNode<T>(data); if (lastNode != null ){ lastNode.nextChainNode = node; node.preChainNode = node; node.setDataNo(size); lastNode = node; size++; } } //刪除指定索引的節點 public void deleteNode( int dataNo) throws Exception { if (getSize() == 0 ){ throw new Exception( "chain is empty" ); } for (ChainNode<T> node = headNode.nextChainNode;node != null ;node = node.nextChainNode) { if (node.getDataNo() == dataNo){ node.preChainNode.nextChainNode = node.nextChainNode; if (node.nextChainNode != null ){ node.nextChainNode.preChainNode = node.preChainNode; } node.nextChainNode = null ; node.preChainNode = null ; size--; //重新設置節點的編號 for (ChainNode<T> chainNode = node.nextChainNode;chainNode != null ;chainNode = chainNode.nextChainNode) { chainNode.setDataNo(chainNode.getDataNo()- 1 ); } return ; } } throw new Exception( "the corresponding data that can not be found" ); } //獲取指定索引的節點 public T get( int dataNo) throws Exception { if (getSize() == 0 ){ throw new Exception( "chain is empty" ); } for (ChainNode<T> node = headNode.nextChainNode;node != null ;node = node.nextChainNode) { if (node.getDataNo() == dataNo){ return node.getData(); } } throw new Exception( "the corresponding data that can not be found" ); } //修改對應索引的節點 public void set( int dataNo,T data) throws Exception { if (getSize() == 0 ){ throw new Exception( "chain is empty" ); } for (ChainNode<T> node = headNode.nextChainNode;node != null ;node = node.nextChainNode) { if (node.getDataNo() == dataNo){ node.setData(data); return ; } } throw new Exception( "the data that is to be modified can not be found" ); } //是否包含對應數據的節點 public boolean isContains(T data) throws Exception { if (getSize() == 0 ){ throw new Exception( "chain is empty" ); } for (ChainNode<T> chainNode = headNode.nextChainNode;chainNode != null ;chainNode = chainNode.nextChainNode) { if (chainNode.getData() == data){ return true ; } } return false ; } //獲取節點數量(不含頭節點) public int getSize() { return size; } } |
測試一下:
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
|
public class ChainTest { public static void main(String[] args) throws Exception{ String oneString = "one" ; String twoString = "two" ; String threeString = "three" ; String fourString = "four" ; Chain<String> chain = new Chain<String>(); chain.addNode(oneString); chain.addNode(twoString); chain.addNode(threeString); chain.addNode(fourString); for ( int i = 0 ; i < chain.getSize(); i++) { String string2 = chain.get(i); System.out.println(string2); } try { String string = chain.get( 2 ); System.out.println( "the data of the second node is" +string); System.out.println(chain.isContains(fourString)); chain.set( 1 , "haha" ); System.out.println( "modify chain" ); for ( int i = 0 ; i < chain.getSize(); i++) { String string2 = chain.get(i); System.out.println(string2); } chain.deleteNode( 3 ); System.out.println( "delete one node" ); for ( int i = 0 ; i < chain.getSize(); i++) { String string2 = chain.get(i); System.out.println(string2); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
one two three four the data of the second node isthree true modify chain one haha three four delete one node one haha three |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/sinat_23092639/article/details/51160621