addFirst
void addFirst(T element) {
SNode<T> newNode = new SNode<T>(element);
newNode.next = first;
first = newNode;
size += 1;
if (last == null) {
last = first;
}
}
addLast
void addLast(T element) {
SNode<T> newNode = new SNode<T>(element);
// newNode.next = null; บรรทัดนี้ลบทิ้งไปได้ เพราะว่าใน constructor ของ SNode
// ตั้งไว้อยู่แล้วว่า next เป็น null
if (size == 0) {
first = newNode;
} else {
last.next = newNode;
}
last = newNode;
size += 1;
}
addAtIndex
void addAtIndex(int index, T element) {
// เขียนเผื่อทุกกรณีเลย
if (index == 0) {
addFirst(element);
} else if (index >= size) {
addLast(element);
} else {
SNode<T> current = first; // อันนี้เอามาเหมือนเป็น Temp ไว้ข้างหน้า
SNode<T> newNode = new SNode<T>(element);
for (int i = 0; i < index - 1; i++) { // Shift element ทุกตัวไปข้างหน้า
// เพื่อจะวางตัวที่เราจะ addAtIndex เข้าไป
current = current.next;
}
newNode.next = current.next;
current.next = newNode;
size += 1;
}
}
removeFirst
T removeFirst() {
if (size == 0) // ถ้า Size = 0 แล้วจะ remove อะไร...?
return null;
else {
SNode<T> tmp = first;
first = first.next;
size -= 1;
if (first == null)
last = null;
return tmp.element;
}
}
removeLast
T removeLast() {
if (size == 0) {
return null;
} else if (size == 1) {
SNode<T> tmp = first;
first = null;
last = null;
size -= 1;
} else {
SNode<T> current = first;
SNode<T> tmp = last;
while (current.next != last) { // Move the pointer
current = current.next;
}
last = current;
last.next = null;
size--;
}
return last.element;
}
removeAtIndex
T removeAtIndex(int index) {
if (size == 0) {
return null;
} else if (index == 0) {
return removeFirst();
} else if (index == size - 1) {
return removeLast();
} else {
SNode<T> tmp = first;
for (int i = 0; i < index - 1; i++) { // Move the pointer
tmp = tmp.next;
}
SNode<T> removeNode = tmp.next;
tmp.next = tmp.next.next;
removeNode.next = null;
size -= 1;
return removeNode.element;
}
}