Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions src/main/java/List/LinkedList/LinkedList_hellomatia.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package List.LinkedList;

import List.List;

public class LinkedList_hellomatia<E> implements List<E> {
private final Node head;
private Node tail;
private int size;

public LinkedList_hellomatia() {
this.head = new Node(null);
this.tail = head;
}

@Override
public void insert(E data) {
tail.setNext(createNode(data));
tail = tail.getNext();
size++;
}

private Node createNode(E data) {
return new Node(data);
}

@Override
public int size() {
return size;
}

@Override
public boolean isEmpty() {
return size() == 0;
}

@Override
public boolean contains(E o) {
for (Node now = head.getNext(); now != null; now = now.getNext()) {
if (now.getData().equals(o)) {
return true;
}
}
return false;
}

@Override
public E get(int index) {
checkIndex(index);
return getNode(index).getData();
}

@Override
public E remove(int index) {
checkIndex(index);
Node removeNode = getNode(index);
Node prevNode = getNode(index - 1);
if (removeNode == tail) {
prevNode.setNext(null);
tail = prevNode;
} else {
prevNode.setNext(removeNode.getNext());
}
removeNode.setNext(null);
size--;
return removeNode.getData();
}

private void checkIndex(int index) {
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException();
}
}

private Node getNode(int index) {
Node now = head.getNext();
for (int i = 0; i < index; i++) {
now = now.getNext();
}
return now;
}

private class Node {
private final E data;
private Node next;

protected Node(E data) {
this.data = data;
}

private Node getNext() {
return next;
}

private void setNext(Node next) {
this.next = next;
}

private E getData() {
return data;
}
}
}
167 changes: 167 additions & 0 deletions src/test/java/List/LinkedList/LinkedListTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
package List.LinkedList;

import static id.ID.hellomatia;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

import List.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class LinkedListTest {

private final LinkedListFactory<Integer> factory = new LinkedListFactory<>();
private List<Integer> list;

@BeforeEach
void init() {
list = factory.createList(hellomatia);
}

@Test
void LinkedList의_생성_및_초기화() {
assertThat(list).isNotNull();
}

@Test
void 데이터_5개_저장() {
list.insert(11);
list.insert(11);
list.insert(22);
list.insert(22);
list.insert(33);

assertThat(list.size()).isEqualTo(5);
assertThat(list.get(0)).isEqualTo(11);
assertThat(list.get(1)).isEqualTo(11);
assertThat(list.get(2)).isEqualTo(22);
assertThat(list.get(3)).isEqualTo(22);
assertThat(list.get(4)).isEqualTo(33);
}

@Test
void 데이터_5개_저장_후_22인_데이터_모두_삭제() {
list.insert(11);
list.insert(11);
list.insert(22);
list.insert(22);
list.insert(33);

for (int i = 0; i < list.size(); i++) {
if (list.get(i) == 22) {
list.remove(i);
i--; // 삭제되면 index가 조정되므로 해당 index부터 다시 확인해야 합니다.
}
}

assertThat(list.size()).isEqualTo(3);
assertThat(list.get(0)).isEqualTo(11);
assertThat(list.get(1)).isEqualTo(11);
assertThat(list.get(2)).isEqualTo(33);
}

@Test
void 데이터_중복_저장_후_모두_포함여부_확인() {
list.insert(11);
list.insert(11);
list.insert(22);
list.insert(22);
list.insert(33);

assertThat(list.contains(11)).isTrue();
assertThat(list.contains(22)).isTrue();
assertThat(list.contains(33)).isTrue();
}

@Test
void 비어있는_리스트_확인() {
assertThat(list.isEmpty()).isTrue();
list.insert(10);
assertThat(list.isEmpty()).isFalse();
}

@Test
void 데이터_삽입_후_크기_확인() {
assertThat(list.size()).isEqualTo(0);
list.insert(10);
assertThat(list.size()).isEqualTo(1);
}

@Test
void 유효하지_않은_인덱스로_데이터_가져오기() {
assertThatThrownBy(() -> list.get(0)).isInstanceOf(IndexOutOfBoundsException.class);
list.insert(10);
assertThatThrownBy(() -> list.get(-1)).isInstanceOf(IndexOutOfBoundsException.class);
assertThatThrownBy(() -> list.get(2)).isInstanceOf(IndexOutOfBoundsException.class);
}

@Test
void 유효하지_않은_인덱스로_데이터_삭제() {
assertThatThrownBy(() -> list.remove(0)).isInstanceOf(IndexOutOfBoundsException.class);
list.insert(10);
assertThatThrownBy(() -> list.remove(-1)).isInstanceOf(IndexOutOfBoundsException.class);
assertThatThrownBy(() -> list.remove(2)).isInstanceOf(IndexOutOfBoundsException.class);
}

@Test
void 모든_데이터_삭제_후_리스트_비우기() {
list.insert(10);
list.insert(20);
list.insert(30);

list.remove(0);
list.remove(0);
list.remove(0);

assertThat(list.size()).isEqualTo(0);
assertThat(list.isEmpty()).isTrue();
}

@Test
void 데이터_삽입_및_삭제_반복() {
list.insert(10);
list.insert(20);
list.insert(30);
list.insert(40);

list.remove(1);
list.insert(50);

assertThat(list.size()).isEqualTo(4);
assertThat(list.get(0)).isEqualTo(10);
assertThat(list.get(1)).isEqualTo(30);
assertThat(list.get(2)).isEqualTo(40);
assertThat(list.get(3)).isEqualTo(50);
}

@Test
void 리스트의_중간에_데이터_삽입() {
list.insert(10);
list.insert(20);
list.insert(30);

list.remove(1);
list.insert(25);

assertThat(list.size()).isEqualTo(3);
assertThat(list.get(0)).isEqualTo(10);
assertThat(list.get(1)).isEqualTo(30);
assertThat(list.get(2)).isEqualTo(25);
}

@Test
void 데이터_5개_삽입_후_모두_삭제() {
list.insert(10);
list.insert(20);
list.insert(30);
list.insert(40);
list.insert(50);

for (int i = 0; i < 5; i++) {
list.remove(0);
}

assertThat(list.size()).isEqualTo(0);
assertThat(list.isEmpty()).isTrue();
}
}
64 changes: 0 additions & 64 deletions src/test/java/List/LinkedList/LinkedListTest_name.java

This file was deleted.