연결된 목록이 있다고 가정합니다. 인접한 두 노드(쌍)를 모두 교환하고 헤드를 반환해야 합니다. 여기서 제약 조건은 노드 값을 수정할 수 없으며 노드 자체만 변경할 수 있다는 것입니다. 따라서 목록이 [1,2,3,4]와 같으면 결과 목록은 [2,1,4,3]이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 머리가 없으면 머리를 반환
- 첫 번째 :=헤드, 두 번째 :=헤드 다음, 더미는 값이 -1인 하나의 새 노드입니다.
- 더미의 다음 :=첫 번째, 이전 :=더미
- 초가 null이 아닌 동안
- temp :=다음 초
- 첫 번째 다음:=두 번째 다음
- 다음의 두 번째 :=첫 번째
- 이전의 다음:=초
- 이전 :=처음
- temp가 null이 아니면 첫 번째 :=temp, 두 번째 :=temp 다음, 그렇지 않으면 중단
- 더미의 다음 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#include <bits/stdc++.h> using namespace std; class ListNode{ public: int val; ListNode *next; ListNode(int data){ val = data; next = NULL; } }; ListNode *make_list(vector<int> v){ ListNode *head = new ListNode(v[0]); for(int i = 1; i<v.size(); i++){ ListNode *ptr = head; while(ptr->next != NULL){ ptr = ptr->next; } ptr->next = new ListNode(v[i]); } return head; } void print_list(ListNode *head){ ListNode *ptr = head; cout << "["; while(ptr->next){ cout << ptr->val << ", "; ptr = ptr->next; } cout << "]" << endl; } class Solution { public: ListNode* swapPairs(ListNode* head) { if(!head)return head; ListNode* first= head; ListNode* second = head->next; ListNode* dummy = new ListNode(-1); dummy->next = first; ListNode* prev = dummy; while(second){ ListNode* temp = second->next; first->next = second->next; second->next = first; prev->next = second; prev = first; if(temp){ first = temp; second = temp ->next; } else break; } return dummy->next; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; ListNode *head = make_list(v); print_list(ob.swapPairs(head)); }
입력
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
출력
[2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13,]