# 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例 1:

输入:head = [1,2,3,4]
输出:
[2,1,4,3]

示例 2:

输入:head = []
输出:
[]

示例 3:

输入:head = [1]
输出:
[1]

 

提示:

 

进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)

以下程序实现了这一功能,请你填补空白处内容: ```cpp #include using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode *swapPairs(ListNode *head) { struct ListNode dummy, *prev = &dummy, *p = head; dummy.next = head; while (p != nullptr && p->next != nullptr) { struct ListNode *q = p->next; _____________________; } return dummy.next; } }; ``` ## template ```cpp #include using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode *swapPairs(ListNode *head) { struct ListNode dummy, *prev = &dummy, *p = head; dummy.next = head; while (p != nullptr && p->next != nullptr) { struct ListNode *q = p->next; p->next = q->next; q->next = prev->next; prev->next = q; prev = p; p = p->next; } return dummy.next; } }; ``` ## 答案 ```cpp p->next = q->next; q->next = prev->next; prev->next = q; prev = p; p = p->next; ``` ## 选项 ### A ```cpp q->next = prev->next; p->next = q->next; prev->next = q; prev = p; p = p->next; ``` ### B ```cpp prev->next = q; p->next = q->next; q->next = prev->next; prev = p; p = p->next; ``` ### C ```cpp p->next = q->next; prev->next = q; prev = p; q->next = prev->next; p = p->next; ```