Leetcode算法Java全解答--24. 两两交换链表中的节点

Leetcode算法Java全解答–24. 两两交换链表中的节点

题目

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

示例:


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

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

想法

声明三个变量存储

cur–当前node,preCur–上一个node,preDoubleCur–上一个node的上一个node

声明循环次数num,偶数次的时候就交换

循环,交换

时间复杂度/空间复杂度: n/1

假设数据为,1,2,3,4,5,6,已经循环到4这个数据

cur: val = 4,next=5

preCur: val = 3,next=4

preDoubleCur: val = 2,next=3

交换方式:

    ListNode tmpCur = cur;
    cur = cur.next;
    
    preDoubleCur.next = tmpCur;
    tmpCur.next = preCur;
    preCur.next = cur;

结果

超过70%的测试案例

时间复杂度/空间复杂度: n/1

总结

代码

我的答案

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

     示例:

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

     你的算法只能使用常数的额外空间。
     你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
     **************************************/

    /**************************************
     *
     * 想法:
     *      1. 声明三个变量存储  cur--当前node,preCur--上一个node,preDoubleCur--上一个node的上一个node
     *         声明循环次数num,偶数次的时候就交换
     *         循环,交换
     *
     *         时间复杂度/空间复杂度: n/1
     *         假设数据为,1,2,3,4,5,6,已经循环到4这个数据
     *         cur: val = 4,next=5
     *         preCur: val = 3,next=4
     *         preDoubleCur: val = 2,next=3
     *
     *         交换方式:
     *                  ListNode tmpCur = cur;
     *                  cur = cur.next;
     *
     *                  preDoubleCur.next = tmpCur;
     *                  tmpCur.next = preCur;
     *                  preCur.next = cur;
     *
     *
     *
     * 我的做法
     *      超过70%的测试案例
     *      时间复杂度/空间复杂度: n/1
     * 代码执行过程:
     *
     * 总结:
     *
     * ***********************************/
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode result = head.next;

        ListNode cur = head;
        ListNode preCur = head;
        ListNode preDoubleCur = head;

        int num = 0;

        while (cur != null) {
            num++;
            if (num % 2 == 0) {
                ListNode tmpCur = cur;
                cur = cur.next;

                preDoubleCur.next = tmpCur;
                tmpCur.next = preCur;
                preCur.next = cur;
                continue;
            }
            preDoubleCur = preCur;
            preCur = cur;
            cur = cur.next;

        }
        return result;
    }
 

大佬们的答案


    public ListNode better(ListNode head) {
        ListNode mid;
        ListNode ans;
        if (head == null || head.next == null) {
            return head;
        }
        ans = head.next;
        while (true) {
            mid = head.next;
            head.next = head.next.next;
            mid.next = head;
            if (head.next != null && head.next.next != null) {
                mid = head.next;
                head.next = head.next.next;
                head = mid;
            } else {
                head = head.next;
                break;
            }

        }
        return ans;
    }

测试用例


    @Test
    public void test024() {
        // 创建测试案例
        ListNode listNode11 = new ListNode(1);
        ListNode listNode12 = new ListNode(2);
        ListNode listNode13 = new ListNode(3);
        ListNode listNode14 = new ListNode(4);
        listNode11.next = listNode12;
        listNode12.next = listNode13;
        listNode13.next = listNode14;

        // 测试案例期望值
        ListNode expResult1 = new ListNode(2);
        ListNode expResult12 = new ListNode(1);
        ListNode expResult13 = new ListNode(4);
        ListNode expResult15 = new ListNode(3);
        expResult1.next = expResult12;
        expResult12.next = expResult13;
        expResult13.next = expResult15;

        Solution024 solution024 = new Solution024();

        ListNode result1 = solution024.swapPairs(listNode11);

        Assert.assertEquals(expResult1.toArray(), result1.toArray());
    }

其他

代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan

“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改

如有疑问请联系,联系方式:QQ3060507060

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值