From 123ac4502e6cc8e474630e4447e79bd36928c321 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 2 Jul 2024 17:17:06 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[LinkedList]:=20LinkedList=5Fenduf7686=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 + .idea/gradle.xml | 17 ++ .idea/misc.xml | 8 + .idea/vcs.xml | 6 + .../List/LinkedList/LinkedList_enduf7686.java | 107 +++++++++++ .../LinkedList/LinkedListTest_enduf7686.java | 172 ++++++++++++++++++ 6 files changed, 318 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/List/LinkedList/LinkedList_enduf7686.java create mode 100644 src/test/java/List/LinkedList/LinkedListTest_enduf7686.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..f07d8ac --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..056a56f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/List/LinkedList/LinkedList_enduf7686.java b/src/main/java/List/LinkedList/LinkedList_enduf7686.java new file mode 100644 index 0000000..a66e4c3 --- /dev/null +++ b/src/main/java/List/LinkedList/LinkedList_enduf7686.java @@ -0,0 +1,107 @@ +package List.LinkedList; + +import List.List; + +public class LinkedList_enduf7686 implements List { + + private Node head; + private Node tail; + + private int size; + + @Override + public void insert(E data) { + if (head == null) { + head = new Node<>(data); + tail = head; + } else { + tail.next = new Node<>(data); + tail.next.prev = tail; + tail = tail.next; + } + + size++; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return head == null && tail == null && size == 0; + } + + @Override + public boolean contains(E o) { + Node node = head; + + while (node != null) { + if (node.value.equals(o)) { + return true; + } + + node = node.next; + } + + return false; + } + + @Override + public E get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Node node = head; + + for (int i = 0; i < index; i++) { + node = node.next; + } + + return node.value; + } + + @Override + public E remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Node node = head; + + for (int i = 0; i < index; i++) { + node = node.next; + } + + if (node.prev != null) { + node.prev.next = node.next; + } + + if (node.next != null) { + node.next.prev = node.prev; + } + + size--; + + if (size == 0) { + head = null; + tail = null; + } + + return node.value; + } + + private static class Node { + + private E value; + + private Node prev; + private Node next; + + public Node(E value) { + this.value = value; + } + } +} diff --git a/src/test/java/List/LinkedList/LinkedListTest_enduf7686.java b/src/test/java/List/LinkedList/LinkedListTest_enduf7686.java new file mode 100644 index 0000000..52f7698 --- /dev/null +++ b/src/test/java/List/LinkedList/LinkedListTest_enduf7686.java @@ -0,0 +1,172 @@ +package List.LinkedList; + +import List.List; +import id.ID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static id.ID.*; +import static id.ID.name; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class LinkedListTest_enduf7686 { + + private final LinkedListFactory factory = new LinkedListFactory<>(); + private List list; + + @BeforeEach + void init() { + //깃허브 아이디 입력하면 각자 만든 리스트 객체 생성 + list = factory.createList(enduf7686); + } + + @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); + + // Iterable을 구현하면 enhanced for loop를 사용할 수 있습니다. + 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(); + } +} \ No newline at end of file From e0243664e1d38d1c4b8a21067900674c3434d00d Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 2 Jul 2024 17:31:24 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[LinkedList]:=20LinkedList=5Fenduf7686=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B9=8C=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 17 ----------------- .idea/misc.xml | 6 +----- .idea/vcs.xml | 6 ------ 3 files changed, 1 insertion(+), 28 deletions(-) delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index f07d8ac..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 056a56f..901eaf0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,4 @@ - - - - - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file