1. 문제
leetcode 24. swap nodes in pairs
한방향 연결리스트가 주어지면 인접한 모든 두 노드의 방향을 바꾸어 바뀐 리스트의 head를 리턴하여라.
2. 반복을 이용한 풀이
이 문제를 해결하기 위해서는 인접한 두 노드 간의 포인터 방향만 바꾸면 안된다. 앞에 있던 노드가 가리키는 포인터 방향도 바꾸어야한다. 포인터 세개를 관리하면서 반복문을 통해 문제를 해결할 수 있다.
먼저 head 뒤 노드를 b, 앞 노드를 prev라고 지정한다. 그리고 b가 head를 가리키고, head는 b 다음의 노드를 가리키도록 한다. 원래 head를 가리키던 prev는 p를 가리키도록 한다. 마지막으로 다음 비교를 위해 head, prev를 뒤로 한칸씩 옮긴다. 이 과정을 두 개 이상의 노드가 남아 있을 동안 반복한다.
3. 재귀를 이용한 풀이
주어진 노드 중 가장 앞 노드를 리턴하는 재귀함수를 이용해서 문제를 풀 수도 있다. 먼저 남은 노드가 1개 이하라면, 마지막 노드 또는 None일 head를 리턴한다. 남은 노드가 2개 이상이라면 head의 다음 노드를 p로 지정한다. 그리고 head가 가리킬 다음 노드를 재귀 호출을 통해서 지정한다. 전달되는 인자 head는 p 다음 노드를 넘겨준다. 그리고 p가 head를 가리키도록 화살표의 방향을 변경한다. 마지막으로 지금 맨 앞에 있는 노드인 p를 리턴한다. 리스트가 끝날 때까지 함수가 재귀적으로 호출되고, 리스트가 종료된다면 함수가 순차적으로 리턴되면서 바뀐 위치에 맞도록 연결이 이루어질 것이다.
'Computer Science > 알고리즘' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰] 17. 전화번호 문자 조합 (0) | 2022.02.19 |
---|---|
[파이썬 알고리즘] DFS와 BFS를 이용한 그래프 탐색 (0) | 2022.02.18 |
[파이썬 알고리즘] 14. 역순 연결리스트 (0) | 2022.02.14 |
[파이썬 알고리즘 인터뷰] 13. 두 정렬 리스트의 병합 (0) | 2022.02.13 |
[파이썬 알고리즘 인터뷰] 12. 팰린드롬 연결리스트 (0) | 2022.02.13 |