Cho danh sách liên kết, hoán đổi mỗi hai nút liền kề (theo cặp) và trả về đầu danh sách mới. Không được sửa giá trị nút, chỉ được thay đổi con trỏ. Ví dụ: [1,2,3,4] → [2,1,4,3].
Quy trình giải quyết
- Nếu
headrỗng, trả vềhead. - Khởi tạo
first = head,second = head.next, nút giảdummy(-1)trỏ đếnfirst,prev = dummy. - Trong khi
secondkhông null:temp = second.next.- Hoán đổi:
first.next = second.next,second.next = first,prev.next = second. - Cập nhật
prev = first. - Nếu
temptồn tại:first = temp,second = temp.next, ngược lại thoát.
- Trả về
dummy.next.
Ví dụ mã nguồn (C++)
#includeusing namespace std; class ListNode { public: int val; ListNode *next; ListNode(int data) { val = data; next = NULL; } }; ListNode* make_list(vector 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; } }; int main() { Solution ob; vector 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)); // Output: [2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, ] }
Đầu vào
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
Đầu ra
[2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, ]