Skip to content

Commit 5bc9830

Browse files
committed
[hamill] feat : singly linked list
- 삽입 메서드() : 시작에 추가 - 삽입 메서드() : 끝에 추가 - 검색 메서드() : 특정 위치의 노드를 찾아내는 방법 - 삽입 메서드() : 중간에 추가 - 출력 메서드() - 삭제 메서드() : 처음 노드 삭제 - 삭제 메서드() : 중간 노드 삭제 - size 메서드() : 엘리먼트의 크기를 리턴 - index 메서드() : 엘리먼트의 인덱스 값을 리턴 - search 메서드() : 특정한 값에 대한 인덱스 값 리턴
1 parent 0e5c95b commit 5bc9830

File tree

1 file changed

+150
-2
lines changed
  • hamill/src/main/java/com/codesquad/datastructurestudy/linkedlist

1 file changed

+150
-2
lines changed

hamill/src/main/java/com/codesquad/datastructurestudy/linkedlist/LinkedList.java

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class LinkedList {
66
private Node tail;
77
private int size = 0;
88

9-
private class Node {
9+
private static class Node {
1010
// 데이터가 저장될 필드
1111
private Object data;
1212
// 다음 노드를 가리키는 필드
@@ -20,6 +20,154 @@ public String toString() {
2020
return String.valueOf(this.data);
2121
}
2222
}
23-
2423

24+
// 삽입 - 시작에 추가
25+
public void addFirst(Object input) {
26+
// 노드를 생성합니다
27+
Node newNode = new Node(input);
28+
// 새로운 노드의 다음 노드로 헤드를 지정합니다
29+
newNode.next = head;
30+
// 헤드로 새로운 노드를 지정합니다.
31+
head = newNode;
32+
size++;
33+
if (head.next == null) {
34+
tail = head;
35+
}
36+
}
37+
38+
// 삽입 - 끝에 추가
39+
public void addLast(Object input) {
40+
// 노드를 생성합니다.
41+
Node newNode = new Node(input);
42+
// 리스트의 노드가 없다면 첫 번째 노드를 추가하는 메소드를 사용합니다
43+
if (size == 0) {
44+
addFirst(input);
45+
} else {
46+
// 마지막 노드의 다음 노드로 생성한 노드를 지정합니다.
47+
tail.next = newNode;
48+
// 마지막 노드를 갱신합니다.
49+
tail = newNode;
50+
// 엘리먼트의 개수를 1 증가 시킵니다
51+
size++;
52+
}
53+
}
54+
55+
// 검색 - 특정 위치의 노드를 찾아내는 방법
56+
Node node(int index) {
57+
Node x = head;
58+
for (int i = 0; i < index; i++) {
59+
x = x.next;
60+
}
61+
return x;
62+
}
63+
64+
// 삽입 - 중간에 추가
65+
public void add(int k, Object input) {
66+
// 만약 k가 0이라면 첫 번째 노드에 추가하는 것이기 때문에 addFirst를 사용
67+
if (k == 0) {
68+
addFirst(input);
69+
} else {
70+
Node temp1 = node(k-1);
71+
// k 번째 노드를 temp2로 지정합니다
72+
Node temp2 = temp1.next;
73+
// 새로운 노드를 생성합니다
74+
Node newNode = new Node(input);
75+
// temp1의 다음 노드로 새로운 노드를 지정합니다.
76+
temp1.next = newNode;
77+
// 새로운 노드의 다음 노드로 temp2를 지정합니다.
78+
newNode.next = temp2;
79+
size++;
80+
// 새로운 노드의 다음 노드가 없다면 새로운 노드가 마지막 노드이기 때문에 tail로 지정합니다
81+
if (newNode.next == null) {
82+
tail = newNode;
83+
}
84+
}
85+
}
86+
87+
// 출력
88+
public String toString() {
89+
// 노드가 없다면 []를 리턴합니다
90+
if (head == null) {
91+
return "[]";
92+
}
93+
// 탐색을 시작합니다
94+
Node temp = head;
95+
//String str = "[";
96+
StringBuilder str = new StringBuilder("[");
97+
// 다음 노드가 없을 때까지 반복문을 실행합니다
98+
// 마지막 노드는 다음 노드가 없기 때문에 아래의 구문은 마지막 노드는 제외됩니다
99+
while (temp.next != null) {
100+
// str += temp.data + ",";
101+
str.append(temp.data).append(",");
102+
temp = temp.next;
103+
}
104+
// 마지막 노드를 출력 결과에 포함시킵니다
105+
str.append(temp.data);
106+
return str+"]";
107+
}
108+
109+
// 삭제 - 처음 노드 삭제
110+
public Object removeFirst() {
111+
// 첫 번째 노드를 temp로 지정하고 head의 값을 두 번째 노드로 변경합니다
112+
Node temp = head;
113+
head = temp.next;
114+
// 데이터를 삭제하기 전에 리턴할 값을 임시 변수에 담습니다.
115+
Object returnData = temp.data;
116+
temp = null;
117+
size--;
118+
return returnData;
119+
}
120+
121+
// 삭제 - 중간 노드 삭제
122+
public Object remove(int k) {
123+
if (k == 0) {
124+
return removeFirst();
125+
}
126+
// k-1 번째 노드를 temp의 값으로 지정합니다.
127+
Node temp = node(k-1);
128+
// 삭제 노드를 todoDeleted에 기록해 둡니다.
129+
// 삭제 노드를 지금 제거하면 삭제 앞 노드의 삭제 뒤 노드를 연결 할 수 없습니다.
130+
Node todoDeleted = temp.next;
131+
// 삭제 앞 노드의 다음 노드로 삭제 뒤 노드를 지정합니다.
132+
temp.next = temp.next.next;
133+
// 삭제된 데이터를 리턴하기 위해서 returnData에 데이터를 저장합니다
134+
Object returnData = todoDeleted.data;
135+
if (todoDeleted == tail) {
136+
tail = temp;
137+
}
138+
// cur.next를 삭제합니다.
139+
todoDeleted = null;
140+
size--;
141+
return returnData;
142+
}
143+
144+
// 엘리먼트의 크기
145+
public int size() {
146+
return size;
147+
}
148+
149+
// 엘리먼트 가져오기
150+
public Object get(int k) {
151+
Node temp = node(k);
152+
return temp.data;
153+
}
154+
155+
// 탐색 - 특정한 값에 대한 인덱스 값을 알아내기
156+
public int indexOf(Object data) {
157+
// 탐색 대상이 되는 노드를 temp로 지정합니다.
158+
Node temp = head;
159+
// 탐색 대상이 몇 번째 엘리먼트에 있는지를 의미하는 변수로 index를 사용합니다.
160+
int index = 0;
161+
// 탐색 값과 탐색 대상의 값을 비교합니다.
162+
while (temp.data != data) {
163+
temp = temp.next;
164+
index++;
165+
// temp의 값이 null이라는 것은 더 이상 탐색 대상이 없다는 것을 의미합니다.
166+
if (temp == null) {
167+
return -1;
168+
}
169+
}
170+
// 탐색 대상을 찾았다면 대상의 인덱스 값을 리턴합니다.
171+
return index;
172+
}
25173
}

0 commit comments

Comments
 (0)