题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
思路
1、使用哨兵节点。哨兵节点是一个在链表头部新增的节点,不存储任何值,仅仅为了简化操作。如果不加哨兵节点,则需要对第一个节点进行特殊处理,使得操作变得更加复杂。
2、交换过程如下图所示(字不好将就着看吧hhh)
代码实现
/**
* Definition for singly-linked list.
* 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) {
ListNode* front = new ListNode;
front->next = head;
ListNode*l1 = front;//要交换的节点的前驱
ListNode*l2 = head;
while(l1->next!=NULL && l1->next->next!=NULL){
l2 = l1 -> next;
l1 -> next = l2->next;
l2->next = l2->next->next;
l1->next->next = l2;
l1 = l2;
}
return front -> next;
}
};