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

本文介绍了一种在常数额外空间下,两两交换链表中相邻节点的方法。通过三步操作:修改前节点指向,调整被交换节点的链接,以及更新交换后的节点链接,实现了节点的实际交换。代码示例展示了如何利用虚拟节点简化边界条件处理。

题目

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换

解析

在这里插入图片描述
解读:如上图所示,需要交换1,2两个节点。那么分三步走:

  • 第一步:修改pre节点的next指向节点2
  • 第二步:修改节点1的next指向节点3
  • 第三步:修改节点2的next指向节点1
    然后只需要保存上一次交换后的末尾节点,一直循环,考虑好边界条件。

代码实现

public static ListNode swapPairs(ListNode node) {


        if(node == null || node.next == null){
            return node;
        }
        /**
         * 因为头节点是start而不是pre,所以需要新建一个虚拟节点root
         */
        ListNode root = new ListNode(0);
        root.next = node;
        ListNode pre = root;
        while (pre.next != null && pre.next.next != null){
            /**
             * 定义start和then
             */
            ListNode start = pre.next;
            ListNode then = pre.next.next;
            /**
             * 三步走
             */
            pre.next = then;
            start.next = then.next;
            then.next = start;
            /**
             * 下一个pre节点为start节点
             */
            pre = start;
        }

        /**
         * 这里应该也是返回虚拟节点的next
         */
        return root.next;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值