1、如果整个链表数量是偶数个,两两交换,第二个节点指向第一个节点,第二个节点后面的节点也需要保存,不然就断联系了,所以得保存3个节点,1 2 3,1 和 2 交换位置后,1得指向3,但是3也需要后3后面的那个4交换位置,所以1实际要指向4,可以发现,两两交换后,下一个要指向的元素就是下一个交换后的头节点,是一个递归的操作。1 2 3 4,1 2变成2 1后,1的next要变成下一次交换后的头节点,3 4 交换后就是4 3,所以1.next = 4,整体变成了2 1 4 3 ,3.next = 下一轮交换后的头节点。
2、写一个递归函数,交换两个节点后返回头节点。让头节点成为递归联系。
/**
* 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) {
return connect(head);
}
//互逆之后返回头节点
public ListNode connect(ListNode root){
if(root == null){
return null;
}
//保存3个节点信息。实现互逆并且与下一个递归函数联系起来。
ListNode left = root;
ListNode mid = root.next;
//如果是奇数的话,最后一个不用交换。直接作为头节点返回。
if(mid == null){
return root;
}
ListNode right = mid.next;
// 1 2 变成了 2 1,1要指向下一轮交换的头节点。
mid.next = left;
left.next = connect(right);
//返回头节点
return mid;
}
}
?
|