빠에야는 개발중
단순 연결리스트 역순으로 뒤집기 본문
단순 연결리스트에 대한 개념이 부족해서 전에는 풀지 못했던 문제였고, 공부를 해보았다. 한쪽 방향으로만 연결되어있다는 특징을 최대한 활용해야하는 문제이다.
일반적인 배열이나 ArrayList라면 인덱스로 간단하게 바꿀 수 있다. 이중 연결리스트도 오버헤드가 좀 들지만 비교적 간단하게 가능하다. 하지만 단순 연결리스트는 생각을 좀 해야하는데, 처음에 생각했던 방법은 모든 요소를 스택에 집어넣어서 하나씩 빼며 리스트를 새로 생성하는 것이었다. 하지만 이 방법은 리스트의 크기만큼의 메모리가 필요하기 때문에 규모가 커지면 효율적이지 못하다. 시간적으로도 선형 탐색을 두번해야한다는 점에서 그 단점을 알 수 있다. 그래서 추가메모리를 최대한 줄이고 탐색 시간도 줄이기 위해서는 다음과 같이 하면 된다.
핵심은 새로운 리스트의 맨 끝을 나타내는 null 값이 들어있는 노드를 생성하고, 기존 리스트를 순회하면서 가장 첫번째 노드를 앞에 붙인다는 것이다. 이렇게하면 새노드->next는 새로운 리스트의 맨 앞(가장 처음이라면 null 값이 들어있는 노드)를 가리키게 되어 결과적으로 역순이 되는 것이다. 소스는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 | Node reverse(Node head) { Node p, q, r; p = head; q = null; while(p!=null) { r = q; q = p; p = p.next; q.next = r; } return q; } | cs |
간단한 코드인데 그때는 왜 못했을까... 더 열심히 공부해야겠다.
'공부 > 알고리즘 문제' 카테고리의 다른 글
New Year Chaos (0) | 2019.04.02 |
---|---|
Jumping on the Clouds (0) | 2019.03.29 |
거스름돈 (0) | 2018.03.15 |
3xn 타일링 (0) | 2018.03.15 |
과자 많이 먹기 (0) | 2018.03.15 |
Comments