题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/
题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
一个描述清楚的解法:https://leetcode.wang/leetCode-24-Swap-Nodes-in-Pairs.html
1.递归方法:
递归终止条件:当前没有结点了或者只剩一个结点了。
递归调用:使用first和second分别表示要交换的第一个结点和第二个结点,每次调用向下找,直到最后两个结点交换,再一层层返回,到第一组结点,first连接了之后交换好的子链表,second连接first。此时second为第一个结点。
返回值:即第一个结点second
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
//终止条件:当链表中没有结点了,或者只剩一个结点了
if(head == null || head.next == null) {
return head;
}
//first表示交换的第一个结点
ListNode first = head;
//second表示交换的第二个结点
ListNode second = head.next;
//递归进行交换,从最底层即最后两个结点进行交换,再一层层返回到第一组结点
first.next = swapPairs(second.next);
//此时的second是交换后的第一个结点,连上后面的交换好的链表
second.next = first;
return second;
}
}
时间复杂度:O(n);空间复杂度:O(n)