-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinkedList.cs
252 lines (236 loc) · 7.37 KB
/
LinkedList.cs
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SLL
{
/// <summary>
/// A simple basic implementation of singly linked list in C#. The List class implements Add, Find and Delete funcationality without using built-in .NET classes.
/// </summary>
internal class List
{
/// <summary>
/// Node class
/// </summary>
internal class Node
{
private int data;
private Node next = null;
/// <summary>
/// Pointer to next node.
/// </summary>
internal Node Next
{
get { return next; }
set { next = value; }
}
/// <summary>
/// Data stored in the node.
/// </summary>
internal int Data
{
get { return data; }
set { data = value; }
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="d"></param>
internal Node(int d)
{
data = d;
}
}
private int _length;
private Node _head;
/// <summary>
/// Length of the list
/// </summary>
internal int Length
{
get { return _length; }
}
/// <summary>
/// Default Constructor
/// </summary>
internal List()
{
_length = 0;
_head = null;
}
/// <summary>
/// Display all nodes.
/// </summary>
internal void ShowNodes()
{
// Print all nodes till the end of the list.
Node current = _head;
if (current == null)
{
Console.WriteLine("No more nodes to display.");
Console.WriteLine();
}
else
{
ShowLength();
while (current != null)
{
Console.WriteLine("Node : " + current.Data);
current = current.Next;
}
Console.WriteLine();
}
}
/// <summary>
/// Show length of the list.
/// </summary>
internal void ShowLength()
{
string numString = "numbers";
if (_length == 1)
{
numString = "number";
}
Console.WriteLine(String.Format("List has [{0}] {1}.", _length.ToString(), numString));
}
/// <summary>
/// To insert a new Node at the end of the list.
/// </summary>
/// <param name="d"></param>
internal void Add(int d)
{
Console.WriteLine();
Console.WriteLine(String.Format("Add node [{0}].", d.ToString()));
// Create a new Node instance with given data;
Node newNode = new Node(d);
Node current = _head;
if (_head == null)
{
_head = newNode;
}
else
{
// Traverse till the end of the list....
while (current.Next != null)
{
current = current.Next;
}
// Add new node as the next node to the last node.
current.Next = newNode;
}
_length++;
ShowNodes();
}
/// <summary>
/// Delete the node matching specified number, if it exists.
/// </summary>
/// <param name="d"></param>
internal void Delete(int d)
{
Console.WriteLine();
Console.WriteLine(String.Format("Delete node [{0}].", d.ToString()));
// Find the node to be deleted.
Node current = _head;
if (current != null)
{
// Handle the case for 'head' node when first node matches the node to be deleted.
if (current.Data == d)
{
// If first node is not the only node
if (current.Next != null)
{
current = current.Next;
}
else
{
current = null;
}
_head = current;
_length--;
}
else
{
while (current.Next != null && current.Next.Data != d)
{
current = current.Next;
}
if (current.Next != null && current.Next.Data == d)
{
// Set the next pointer of the previous node to be the node next to the one that is being deleted.
current.Next = current.Next.Next;
// Delete the node
current = null;
_length--;
}
else
{
Console.WriteLine(d.ToString() + " could not be found in the list.");
}
}
}
ShowNodes();
}
/// <summary>
/// Find node matching the specified number.
/// </summary>
/// <param name="d"></param>
/// <returns>Returns node matching specifying int.</returns>
internal void Find(int d)
{
Console.WriteLine();
Console.WriteLine(String.Format("Find node [{0}].", d.ToString()));
Node current = _head;
if (current != null)
{
int counter = 1;
while (current.Next != null && current.Data != d)
{
current = current.Next;
counter++;
}
if (current.Data == d)
{
Console.WriteLine(String.Format("Found {0} in the list at position [{1}].", d.ToString(), counter.ToString()));
}
else
{
Console.WriteLine(String.Format("{0} was not found in the list.", d.ToString()));
}
}
else
{
Console.WriteLine(String.Format("{0} was not found in the list.", d.ToString()));
}
ShowNodes();
}
}
/// <summary>
/// Client class that runs the program.
/// </summary>
class Program
{
static void Main(string[] args)
{
List list = new List();
// Add a few elements to the list.
list.Add(5);
list.Add(8);
list.Add(9);
list.Add(1);
list.Add(2);
list.Add(3);
list.Delete(2);
list.Delete(5);
list.Delete(1);
list.Delete(3);
list.Delete(4);
list.Find(9);
list.Delete(8);
list.Find(8);
list.Find(9);
// This ensures the command window is displayed in case the program is not run from command prompt.
Console.ReadLine();
}
}
}