-
Notifications
You must be signed in to change notification settings - Fork 1
/
MyLinkedList.cs
158 lines (139 loc) · 5.49 KB
/
MyLinkedList.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
namespace LinkedLists
{
internal class MyLinkedList
{
private Node? _head;
public int Count { get; private set; }
public bool IsEmpty => Count == 0;
public MyLinkedList()
{
Count = 0;
_head = null;
}
public void Add(int index, object data)
{
if (index < 0)
{
throw new IndexOutOfRangeException($"Er du helt sikker? \t Index er {index}");
}
if (index > Count)
{
index = Count;
}
Node current = _head;
if (IsEmpty || index == 0)
{
_head = new Node(data, _head);
}
else
{
for (int i = 0; i < index - 1; i++)
{
current = current.Next;
}
current.Next = new Node(data, current.Next);
}
Count++;
}
public void Add(object data)
{
Add(Count, data);
}
public Node? RemoveAt(int index)
{
Node removedNode = null;
if (index < 0 || index >= Count)
{
throw new IndexOutOfRangeException($"Er du helt sikker? \t Index er {index}");
}
if (IsEmpty)
{
Console.WriteLine("Intet at fjerne!");
return null;
}
Node current = _head;
if (index == 0)
{
removedNode = _head; // the removed Node was "head" prior to this run
_head = current.Next;
}
else
{
for (int i = 0; i < index - 1; i++)
{
current = current.Next;
}
removedNode = current.Next; // the node to remove
current.Next = current.Next.Next;
}
Count--;
return removedNode;
}
public void ReplaceAt(int index, object data)
{
// Guard med besked for tom liste er ikke nødvendig da det opfanges af næste exception : index >= 0
if (index < 0 || index >= Count) // Count er ikke "nul-baseret" og derfor "større end eller LIG med"
{
throw new IndexOutOfRangeException($"Er du helt sikker? \t Index er {index} ");
}
Node current = _head;
// Pas lidt på med at anvende en operator (index--) i et boolsk udtryk (index-- > 0)
// Operatoren vil blive kørt før det boolske udtryk - har index så den værdi som du forventer eller er den en lavere ?
// Måske undersøge edge cases - start og slut af løkken ?
//Vedr. "Pas lidt på med at anvende en operator (index--) i et boolsk udtryk (index-- > 0) ...."
// Det er ikke rigtig Mester: index dekrementeres faktisk efter sammenligning,
// måske tænker du på (--index > 0) ??
while (index-- > 0)
{
current = current.Next;
}
current.Data = data;
}
public void Move(int from, int to)
{
// Tom liste opfanges af exception nedenfor
if (from < 0 )
{
throw new IndexOutOfRangeException("\"From\" værdien er ugyldig! - mindre end nul");
}
if (from >= Count)
{
throw new IndexOutOfRangeException("\"From\" værdien er ugyldig! - større end antal af elementer i listen");
}
if (to < 0)
{
throw new IndexOutOfRangeException("\"To\" værdien er ugyldig! - mindre end nul");
}
if (to >= Count)
{
throw new IndexOutOfRangeException("\"To\" værdien er ugyldig! - større end antal af elementer i listen");
}
// Antagelse: to er højere end from
// Kan man anvende det samme "to index" når en node bliver "klippet" ud af den linkedede liste ?
// Brian her er jeg dig svar skyldig - jeg opfatter denne methode som een der fjerner element MEN
// samtidig også tilføjer et tilsvarende i samme process... hmmm
// Bør det være uændret, en højere eller en lavere ?
// Jeg vil mene efter return er Count uændret..
// Holder antagelsen om at to er højere end from altid ?
// Her tror jeg vi ser forskelligt på målsætningen for Move.
// Min kode virker så "to" kan være mindre end "from".
// Man kan om du vil flytte "begge veje"... se evt aktuel kode i Program.cs
var fromNode = RemoveAt(from);
// Med ! angiver du at der med garanti er data. Kan en node oprettes med null som "data" ?
// Jeg mener at udråbstegnet vedrører Node'n - ikke "data" !?
// Jeg "satser" på at der er en Node - eneste sted dette ikke er tilfældet er vist nok "head"...
// Mth til "data" tror jeg nedenstående overlever null som data...
Add(to, fromNode!.Data);
}
public void Print()
{
Node current = _head;
Console.WriteLine("-------------------------------------------------------------");
for (int i = 0; i < Count; i++)
{
Console.WriteLine($"{i}\t{current.Data}");
current = current.Next;
}
}
}
}