世界已冷酷至极, 让我们携手前行。
自助收录

24. 两两交换链表中的节点(解法二:递归)

算法刷题2年前 (2023)更新 江南白衣
422 0 0
24. 两两交换链表中的节点(解法二:递归)

24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

24. 两两交换链表中的节点(解法二:递归)
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
分析:
递归三部曲模板:
第一步:找终止条件。递归在什么情况下终止?没得交换的时候,递归就终止了。因此当链表只剩一个节点或者没有节点的时候,递归自然就终止了。
第二步:找返回值。 我们希望向上一级递归返回什么信息?由于我们的目的是两两交换链表中相邻的节点,因此自然希望交换给上一级递归的是已经完成交换处理,即已经处理好的链表。
第三步:本级递归应该做什么。 结合第二步,看下图!由于只考虑本级递归,所以这个链表在我们眼里其实也就三个节点:head、head.next、已处理完的链表部分。而本级递归的任务也就是交换这3个节点中的前两个节点。

24. 两两交换链表中的节点(解法二:递归)
package com.codernav.demo.leetcode.linkedlist.swapPairs;

import com.codernav.demo.common.ListNode;

/**
 * @title 24. 两两交换链表中的节点
 * @Description 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
 * 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
 * @Author 开发者导航
 * @website https://www.codernav.com
 * @date 2023/3/4
 */
public class Q_24 {
    public static void main(String[] args) {
        ListNode node4 = new ListNode(4, null);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        ListNode node1 = new ListNode(1, node2);
        ListNode node = swapPairs(node1);
        System.out.println(node);
    }

    public static ListNode swapPairs(ListNode head) {
        //终止条件:链表只剩一个节点或者没节点了,没得交换了。返回的是已经处理好的链表
        if(head == null || head.next == null){
            return head;
        }
        //一共三个节点:head, next, swapPairs(next.next)
        //下面的任务便是交换这3个节点中的前两个节点
        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
        //根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分
        return next;
    }

}
© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...