@@ -6,7 +6,7 @@ public class LinkedList {
6
6
private Node tail ;
7
7
private int size = 0 ;
8
8
9
- private class Node {
9
+ private static class Node {
10
10
// 데이터가 저장될 필드
11
11
private Object data ;
12
12
// 다음 노드를 가리키는 필드
@@ -20,6 +20,154 @@ public String toString() {
20
20
return String .valueOf (this .data );
21
21
}
22
22
}
23
-
24
23
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
+ }
25
173
}
0 commit comments