1. 题⽬链接:24.两两交换链表中的节点
2. 题⽬描述:
3. 解法(递归):
算法思路:
1. 递归函数的含义:交给你⼀个链表,将这个链表两两交换⼀下,然后返回交换后的头结点;
2. 函数体:先去处理⼀下第⼆个结点往后的链表,然后再把当前的两个结点交换⼀下,连接上后⾯处 理后的链表;
3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤交换,直接返回。
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!
C++算法代码:
/**
* 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;
}
//记录返回的更新后的头结点
auto temp=swapPairs(head->next->next);
//记录翻转后的新头结点
auto newhead=head->next;
//翻转两个节点
head->next->next=head;
head->next=temp;
//返回更新后的节点
return newhead;
}
};
Java算法代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution
{
public ListNode swapPairs(ListNode head)
{
if (head == null || head.next == null) return head;
ListNode tmp = swapPairs(head.next.next);
ListNode ret = head.next;
ret.next = head;
head.next = tmp;
return ret;
}
}