两两交换相邻链表中的结点
题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
题解:
迭代:
设置一个虚拟头结点,第一次设置为first结点 后面的连续两个结点设为second和third
/**
* 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*dummyHead=new ListNode(0,head);
ListNode*first=dummyHead;
while(first->next!=nullptr&&first->next->next!=nullptr)
{
ListNode*third=first->next->next;
ListNode*second=first->next;
second->next=third->next; //二号结点连接三号节点的下一个即四号节点地址
first->next=third; //一号结点连接三号节点
third->next=second; //三号结点连接二号节点
first=first->next->next; //一号结点向后移动两步
}
return dummyHead->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 *newhead=head->next;
head->next=swapPairs(newhead->next);
newhead->next=head;
return newhead;
}
};
递归法展开:(以五个结点的链表为例)
swapPairs(ListNode* head) {//①
//第一层递归
newhead =head->next;
head->next=swapPairs(newhead->next);//② head->next=newhead->next->next
//第二层函数递归
{newhead=head->next;
head->next=swapPairs(newhead->head); //③ head->next=newhead->next 当前函数下的head和newhead
//第三层递归 直接有了返回值
{return head;//这里的head是上面函数的newhead->head 是swapPairs(newhead->head)函数的返回值(③) 赋值给上一层的head->next
}
newhead->next=head;
return newhead; //是函数②的返回值
}
newhead->next= head;
return newhead;//嵌套的函数全部有了返回值 这是最终的结果 ①的返回值
}