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;
    }

猜你喜欢

转载自blog.csdn.net/iverson2010112228/article/details/86741277