leetcode 24. 两两交换链表中的节点

leetcode 24. 两两交换链表中的节点_第1张图片

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;
    }
}

 

你可能感兴趣的:(数据结构与算法,链表,leetcode,数据结构,算法,算法笔记)