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

题目:

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

思考:

1. 两两交换,首先想到了各种断开重组的情况,想到了用双指针的方式做;

2. 断开后重组的过程可以分为两步

1)断开形成两个新的子链表,链表结构为所有双数index的链表,和所有单数index的链表

2)将这两个新的子链表合并,从单数开始合并,单数放到偶数前,直到遍历结束

2)双数index的链表个数>=单数index链表的个数,可在遍历时将其作为结束条件

3. 注意边界情况

!!MARK一下第一次执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

代码:

    public static ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode a = head;
        ListNode b = head.next;
        ListNode m = head;
        ListNode n = head.next;

        while (a != null && b!= null) {
            a.next = b.next;
            a = a.next;
            if (a == null) {
                b.next = null;
                break;
            }
            b.next = a.next;
            b = b.next;
        }

        ListNode result = n;
        while (m != null && n!= null) {
            ListNode k = m.next;
            ListNode x = n.next;
            if (n.next == null) {
                n.next = m;
                break;
            }
            m.next = n.next;
            n.next = m;
            m = k;
            n = x;
        }
        return result;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值