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