1 package cn.mdj.singlelink;
2
3 class Link{
4 //链表是由节点组成,所以定义一个Node节点
5 private class Node{
6 //节点的数据分为 数据域 和指针域 所以: 每一个指针域指向下一个节点,而数据域是可以存放任何数据类型
7 private Object data;
8 private Node next;
9 //数据传入,即节点实例化后,就要将数据封装起来
10 public Node(Object data){
11 this.data = data;
12 }
13
14 public void addNode(Node newNode){
15 if(this.next == null){
16 this.next = newNode;
17 }else{
18 this.next.addNode(newNode);
19 }
20 }
21
22 public boolean containsNode(Object data){
23 if(this.data.equals(data)){
24 return true;
25 }else{
26 if(this.next == null){
27 return false;
28 }else{
29 return this.next.containsNode(data);
30 }
31 }
32 }
33
34 public void removeNode(Node pre,Object data){
35 if(data.equals(this.data)){
36 pre.next = this.next;
37 }else{
38 if(this.next != null){
39 this.next.removeNode(this, data);
40 }
41 }
42 }
43
44 public Object getNode(int index){
45 if(Link.this.foot == index){
46 return this.data;
47 }else{
48 Link.this.foot++;
49 return this.next.getNode(index);
50 }
51 }
52
53 public void toArrayNode(){
54 Link.this.restData[Link.this.foot++] = this.data;
55 if(this.next != null){
56 this.next.toArrayNode();
57 }
58 }
59 }
60
61 //节点定义好后,那么首先需要的是一个根节点
62 private Node root;
63 private int count = 0;
64 private int foot =0;
65 private Object[] restData = null;
66 //添加节点
67 public boolean add(Object data){
68 //将数据包装成节点
69 Node newNode = new Node(data);
70 if(this.root == null){
71 this.root = newNode;
72 }else{
73 this.root.addNode(newNode);
74 }
75 this.count++;
76 return true;
77 }
78
79 //既然可以添加节点,当然是可以删除节点的,但要删除,那么首先肯定要查找是否包含这个节点,所以:
80 public boolean contains(Object data){
81 if(this.root == null || data == null){
82 return false;
83 }
84 return this.root.containsNode(data);
85 }
86
87 //有了节点的查找,下面来删除节点
88 public void remove(Object data){
89 //首先查找,是否存在
90 if(this.contains(data)){
91 //首先判断是否是根节点
92 if(this.root.data.equals(data)){
93 this.root = this.root.next;
94
95 }else{
96 this.root.next.removeNode(this.root,data);
97 }
98 }
99 this.count--;
100 }
101
102 //有了增加 删除 查找,当然应该有获取指定的对象,和判断是否为空链表
103
104 //获取
105 public Object get(int index){
106
107 //而要获取指定位置的索引,索引要合法,即不能超过链表的总数,所以在上面定义一个count
108 if(this.count > index){
109 //需要一个角标,从而来去和index,判断所以定义一个foot
110 this.foot = 0;
111 return this.root.getNode(index);
112 }else{
113 return null;
114 }
115 }
116
117 public boolean emptyLink(){
118 return this.count == 0;
119 }
120
121 public int size(){
122 return this.count;
123 }
124
125 //对象数组输出
126 public Object[] toArray(){
127 if(this.root == null){
128 return null;
129 }
130 this.foot = 0;
131 this.restData = new Object[this.count];
132 this.root.toArrayNode();
133 return this.restData;
134 }
135
136 }
137
138
139
140 public class SingleLink {
141
142 /**
143 * @param args
144 */
145 public static void main(String[] args) {
146 Link all = new Link() ;
147 all.add("Hello") ;
148 all.add("World") ;
149 all.remove("World") ;
150 Object array [] = all.toArray() ; // 取得全部数据
151 for (int x = 0 ; x < array.length ; x ++ ) {
152 System.out.println(array[x]) ;
153 }
154 System.out.println(all.contains("Hello")) ;
155 System.out.println(all.get(0)) ;
156 System.out.println(all.get(1)) ;
157 }
158 }