1 public interface IListliner<T>
2 {
3 T GetElement(int i);
4 void Insert(T t, int i);
5 void Add(T t);
6 void Delete(int i);
7 //获取线性表长度
8 int GetLength();
9 bool IsEmpty();
10 int LocationElement(T t);
11 void Clear();
12 void Reverse();
13 }
14 /// <summary>
15 /// 链表节点类型
16 /// </summary>
17 /// <typeparam name="T"></typeparam>
18 class Node<T>
19 {
20 /// <summary>
21 /// 数据
22 /// </summary>
23 private T tdata;
24 public T Data
25 {
26 get { return this.tdata; }
27 set { this.tdata = value; }
28 }
29 /// <summary>
30 /// 节点位置
31 /// </summary>
32 private Node<T> nNext;
33 public Node<T> Next
34 {
35 get { return this.nNext; }
36 set { this.nNext = value; }
37 }
38 public Node()
39 {
40 this.tdata = default(T);
41 this.nNext = null;
42 }
43 public Node(T t)
44 {
45 this.tdata = t;
46 this.nNext = null;
47 }
48 public Node(T t, Node<T> node)
49 {
50 this.tdata = t;
51 this.nNext = node;
52 }
53 }
54 /// <summary>
55 /// 表示链表添加元素的位置:头部和尾部
56 /// </summary>
57 enum AddPosition
58 {
59 Head,
60 Tail
61 }
62
63 /// <summary>
64 /// 单链表类
65 /// </summary>
66 /// <typeparam name="T"></typeparam>
67 class Linkedlist<T> : IListliner<T>
68 {
69 //链表头部
70 private Node<T> tHead;
71 public Node<T> Head
72 {
73 get { return this.tHead; }
74 set { this.tHead = value; }
75 }
76 public Linkedlist()
77 {
78 this.tHead = null;
79 }
80 public Linkedlist(Node<T> node)
81 {
82 this.tHead = node;
83 }
84
85 public T GetElement(int i)
86 {
87 throw new NotImplementedException();
88 }
89 /// <summary>
90 /// i最小从1开始
91 /// </summary>
92 /// <param name="t"></param>
93 /// <param name="i"></param>
94 public void Insert(T t, int i)
95 {
96 Node<T> insertNode = new Node<T>(t, null);//实例化添加的node;
97 if(this.Head==null||i==1)
98 {
99 this.Head = insertNode;
100 }
101 if(i<1|| i>this.GetLength()||(tHead==null&&i==1))
102 {
103 Console.WriteLine("There are no elements in this linked list!");
104 return;
105 }
106 int j = 1;
107 Node<T> node = tHead;
108 Node<T> nodeTmp;
109 while(node !=null &&j <i)
110 {
111 node = node.Next;
112 j++;
113 }
114 nodeTmp = node.Next;
115 node.Next = insertNode;
116 insertNode.Next = nodeTmp;//待插入的node插入后,其后继node为原来链表的第i+1个node
117 }
118 /// <summary>
119 /// 添加元素。选择添加位置
120 /// </summary>
121 /// <param name="t"></param>
122 /// <param name="p"></param>
123 public void Add(T t, AddPosition p)
124 {
125 if (p == AddPosition.Tail)
126 {
127 Add(t);//尾部添加
128 }
129 else
130 {
131 Node<T> node = Head;
132 Node<T> tmp = new Node<T>(t);
133 if (node == null)
134 {
135 Head = node;
136 }
137 else
138 {
139 tmp.Next = node;
140 Head = tmp;
141 }
142 }
143 }
144 /// <summary>
145 /// 添加到尾部
146 /// </summary>
147 /// <param name="t"></param>
148 public void Add(T t)
149 {
150 Node<T> LastNode=new Node<T>(t,null);
151 if(tHead==null)
152 {
153 tHead = LastNode;
154 }
155 else
156 {
157 Node<T> node = tHead;
158 while(node.Next!=null)
159 {
160 node = node.Next;
161 }
162 node.Next = LastNode;
163 }
164 }
165
166 public void Delete(int i)
167 {
168 if(i<1||i>GetLength())
169 {
170 Console.WriteLine("Location Error");
171 return;
172 }
173 else
174 {
175 if (i == 1)
176 {
177 Node<T> node = tHead;
178 tHead = node.Next;
179 }
180 else
181 {
182 Node<T> node = tHead;
183 int j = 1;
184 while(j<i)
185 {
186 node = node.Next;
187 j++;
188 }
189 node.Next=node.Next.Next;
190 }
191 }
192 }
193
194 public int GetLength()
195 {
196 Node<T> node = new Node<T>();
197 int count = 0;
198 node = Head;
199 while (node != null)
200 {
201 count++;
202 node = node.Next;
203 }
204 return count;
205 }
206 public T GetElement(int i)
207 {
208 if(i<1||i>GetLength())
209 {
210 Console.WriteLine("Location error");
211 return default(T);
212 }
213 else
214 {
215 if(i==1)
216 {
217 return tHead.Data;
218 }
219 else
220 {
221 Node<T> node = tHead;
222 int j = 1;
223 while (j < i)
224 {
225 node = node.Next;
226 j++;
227 }
228 return node.Data;
229 }
230 }
231 }
232
233 public bool IsEmpty()
234 {
235 return tHead == null;
236 }
237
238 public int LocationElement(T t)
239 {
240 if(tHead==null)
241 {
242 Console.WriteLine("there is no element in the list");
243 return -1;
244 }
245 Node<T> node = tHead;
246 int i = 0;
247 while(node!=null)
248 {
249 i++;
250 if (node.Data.Equals(t))
251 {
252 return i;
253 }
254 node = node.Next;
255 }
256 Console.WriteLine("no found");
257 return -1;
258 }
259
260 /// <summary>
261 /// thead设为null后,则所有后继结点由于失去引用
262 /// </summary>
263 public void Clear()
264 {
265 tHead = null;
266 }
267
268 public void Reverse()
269 {
270 if(tHead==null)
271 {
272 Console.WriteLine("There is no element in the list");
273 }
274 else
275 {
276 Node<T> node = tHead;
277 if (node.Next == null) { }
278 else
279 {
280 Node<T> node1 = node.Next;
281 Node<T> node2;
282 while (node != null)
283 {
284 node2 = node.Next.Next;
285 node.Next = node2;//可以发现node始终未变,始终是原来的那个头节点
286 node1.Next = this.tHead;
287 this.tHead = node1;
288 node1 = node2;
289 }
290 }
291 }
292 }
293 }