算法精讲-leetcode24-两两交换链表中的节点

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.

解法一:

节点交换思路

在这里插入图片描述

复杂度分析:

时间复杂度:O(N),其中 N 指的是链表的节点数量。
空间复杂度:O(1)。

代码示例:

public class Test {

    public static void main(String[] args) {
        //初始化node链表
        Node node = initNode();
        //打印信息
        printValueList(node, "【初始node】");
        //交换
        node =  swapNode(node);
        //打印信息
        printValueList(node, "【交换结束】");
    }

    private static Node swapNode(Node node) {

        //定义起始空节点
        Node headNode = new Node(-1);
        headNode.next = node;

        Node preNode = headNode;
        while (node != null && node.next != null){
            //记录需要交换的节点
            Node firstNode = node;
            Node secondNode = node.next;

            //交换
            preNode.next = secondNode;
            secondNode.next = firstNode;
            firstNode.next = secondNode.next;

            //更新node【未交换的剩余链表】和preNode【剩余链表的前驱节点】
            node = firstNode.next;
            preNode = firstNode;
        }
        return headNode.next;
    }

    //打印
    private static void printValueList(Node node,String num) {
        List<Integer> numList = new ArrayList<>();
        while (node != null){
            numList.add(node.value);
            node = node.next;
        }
        System.out.println("第"+num+"条链表的value集合为:"+numList);
    }

    private static Node initNode() {
        Node node = new Node(10);
        for (int i=9; i>0; i--){
            Node nodeTemp = new Node(i);
            nodeTemp.next = node;
            node = nodeTemp;
        }
        return node;
    }
}

//Node节点
class Node{
    public Integer value;
    public Node next;

    public Node(Integer value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", next=" + next +
                '}';
    }
}

解法二:

复杂度分析:

时间复杂度:O(N),其中 N 指的是链表的节点数量。
空间复杂度:O(N),递归过程使用的堆栈空间。

代码示例:

public class Test {

    public static void main(String[] args) {
        //初始化node链表
        Node node = initNode();
        //打印信息
        printValueList(node, "【初始node】");
        //交换
        node =  swapNode(node);
        //打印信息
        printValueList(node, "【交换结束】");
    }

    private static Node swapNode(Node node) {
        if (node == null || node.next == null){
            return node;
        }
        //记录需要交换的两个节点
        Node firstNode = node;
        Node secondNode = node.next;
        //交换
        firstNode.next = swapNode(secondNode.next);
        secondNode.next = firstNode;

        return secondNode;
    }

    private static void printValueList(Node node,String num) {
        List<Integer> numList = new ArrayList<>();
        while (node != null){
            numList.add(node.value);
            node = node.next;
        }
        System.out.println("第"+num+"条链表的value集合为:"+numList);
    }

    private static Node initNode() {
        Node node = new Node(10);
        for (int i=9; i>0; i--){
            Node nodeTemp = new Node(i);
            nodeTemp.next = node;
            node = nodeTemp;
        }
        return node;
    }
}

//Node节点
class Node{
    public Integer value;
    public Node next;

    public Node(Integer value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", next=" + next +
                '}';
    }
}

运行结果

在这里插入图片描述

leetcode题目链接

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论

发布了26 篇原创文章 · 获赞 59 · 访问量 4387

猜你喜欢

转载自blog.csdn.net/weixin_43954926/article/details/104274767
今日推荐