SList

Updated 4 Oct 2026

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;
 
	}
}