题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换
/**
* 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* begin=new ListNode(0);
begin->next=head;
head=begin;
ListNode* temp;
ListNode* temp2;
//现在的head是已经分配好的部分的尾部
//需要注意每次我们进行交换的时候我们必须考虑前后节点的地址空间
//需要记录两个交换的节点,所以需要两个临时变量
while(head->next!=nullptr&&head->next->next!=nullptr){
temp=head->next;
head->next=head->next->next;
temp2=head->next->next;
head->next->next=temp;
temp->next=temp2;
head=temp;
}
return begin->next;
}
};
使用递归,我们每次做的工作都是交换第一个节点与第二个节点的重复工作,而我们所需要的只不过是返回第一个节点的地址。我们我们处理内部交换,返回当前的头结点即可
/**
* 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) {
if(head==nullptr||head->next==nullptr)
return head;
ListNode* temp=head->next;
head->next=swapPairs(head->next->next);
temp->next=head;
return temp;
}
};