-
Notifications
You must be signed in to change notification settings - Fork 0
/
List3.js
163 lines (137 loc) · 3.53 KB
/
List3.js
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
/**
* Creates a new List. A list lets you add and remove elements at the current position
* of the iterator, which starts at the start of the list and can be moved with the functions.
*/
var List3 = (function () {
"use strict";
function List() {
this.head = null;
this.tail = null;
this.length = 0;
}
function Iterator(list, head, tail) {
this.list = list;
this.following = head;
this.previows = tail;
}
List.prototype = {
// Adds the element between the previows and following (private method)
add: function (item, prev, next) {
var node = {
data: item,
prev: prev,
next: next
};
if (this.head === null) {
this.head = node;
this.tail = node;
} else if (prev) {
this.tail.next = node;
this.tail = node;
} else if (next) {
this.head.prev = node;
this.head = node;
}
this.length += 1;
return node;
},
// Adds the item at the beggining of the list
addFirst: function (item) {
this.add(item, null, this.head);
return this.iterate();
},
// Adds the item at the end of the list
addLast: function (item) {
this.add(item, this.tail, null);
return this.iterateLast();
},
// Returns the first elements data
first: function () {
return this.head.data;
},
// Returns the last elements data
last: function () {
return this.tail.data;
},
// Returns true if the queue is empty, and false otherwise
isEmpty: function () {
return this.head === null;
},
// Returns the size of the list
size: function () {
return this.length;
},
// Sets the current on the first element
iterate: function () {
return new Iterator(this, this.head, null);
},
// Sets the current on the last element
iterateLast: function () {
return new Iterator(this, null, this.tail);
}
};
Iterator.prototype = {
// Moves to the next element if there is one
next: function () {
if (this.hasNext()) {
this.following = this.following.next;
this.previows = this.following.prev;
}
},
// Moves to the previews element if there is one
prev: function () {
if (this.hasPrev()) {
this.following = this.previows;
this.previows = this.previows.prev;
}
},
// Checks if there is a next elements (from the current one)
hasNext: function () {
return this.following !== null;
},
// Checks if there is a previews element (from the current one)
hasPrev: function () {
return this.previows !== null;
},
// Returns the following elements data
getNext: function () {
if (this.hasNext()) {
return this.following.data;
}
},
// Returns the previws elements data
getPrev: function () {
if (this.hasPrev()) {
return this.previows.data;
}
},
// Removes the follwing element and sets the next one as the new following element
removeNext: function () {
// Cant remove next if there isnt one
if (!this.hasNext()) {
return;
}
if (this.following.next) {
this.following.next.prev = this.following.prev;
} else {
this.list.tail = this.following.prev;
}
if (this.following.prev) {
this.following.prev.next = this.following.next;
} else {
this.list.head = this.following.next;
}
this.following = this.following.next;
this.list.length -= 1;
},
// Removes the previows element and sets the prev one as the new previows element
removePrev: function () {
// Removes if the is a previows one
if (this.hasPrev()) {
this.prev();
this.removeNext();
}
}
};
return List;
}());