File tree Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * 단일 연결리스트(Singly Linked List)의 노드 순서를 반대로 뒤집어서 리턴하기
3
+ * follow-up: 연결리스트는 반복적(Iterative) 또는 재귀적(Recursive)으로 뒤집을 수 있는데, 두 가지 방법 다 가능?
4
+ *
5
+ * 반복문(Iterative) 방식
6
+ * 포인터 세 개(prev, curr, next)를 사용, 리스트를 한 번 순회하며 역방향으로 연결을 바꿈
7
+ * 시간복잡도: O(n), 공간복잡도: O(1)
8
+ *
9
+ * 재귀(Recursive) 방식
10
+ * 재귀적으로 끝까지 들어간 뒤, 각 노드의 next를 역방향으로 연결
11
+ * 시간복잡도: O(n), 공간복잡도: O(n) (재귀 콜스택)
12
+ */
13
+
14
+ /**
15
+ * Definition for singly-linked list.
16
+ * function ListNode(val, next) {
17
+ * this.val = (val===undefined ? 0 : val)
18
+ * this.next = (next===undefined ? null : next)
19
+ * }
20
+ */
21
+ /**
22
+ * @param {ListNode } head
23
+ * @return {ListNode }
24
+ */
25
+ // 반복문(Iterative) 방식
26
+ var reverseList = function ( head ) {
27
+ let prev = null ;
28
+ let curr = head ;
29
+ while ( curr ) {
30
+ const next = curr . next ; // 다음 노드 저장
31
+ curr . next = prev ; // 현재 노드의 next를 prev로 변경
32
+ prev = curr ; // prev를 현재 노드로 이동
33
+ curr = next ; // curr를 다음 노드로 이동
34
+ }
35
+ return prev ;
36
+ } ;
37
+
38
+ // 재귀(Recursive) 방식
39
+ var reverseList = function ( head ) {
40
+ if ( ! head || ! head . next ) return head ; // 빈 리스트 또는 마지막 노드인 경우, 빠른 리턴
41
+
42
+ const reversed = reverseList ( head . next ) ; // 나머지 리스트 역순
43
+ head . next . next = head ; // 다음 노드의 next를 현재 노드로
44
+ head . next = null ; // 현재 노드의 next를 null로
45
+ return reversed ;
46
+ } ;
You can’t perform that action at this time.
0 commit comments