力扣链接:https://leetcode.cn/problems/swap-nodes-in-pairs/

题目

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

示例1:

          

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例2:

输入:head = []
输出:[]

示例3:

输入:head = [1]
输出:[1]

当拿到这个题目,我相信很多人跟我一样,比较蒙蔽了,这怎么交换啊?这个题目需要去模拟,待我一一来分析。

思路

    建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序初始时,cur指向虚拟头结点,然后进行如下三步(来自代码随想录):

        

     操作之后,链表如下:

     

     看这个可能就更直观一些了:

     

    看完这个过程是不是理解很多了,本人也是。

    由此我们可以写出我们的代码:

  class Solution {

    public ListNode swapPairs(ListNode head) {
        ListNode dm=new ListNode(0);
        dm.next=head;
        ListNode curr=dm;
        while(curr.next!=null && curr.next.next!=null){
            ListNode temp1=curr.next;
            ListNode temp2=curr.next.next.next;
            curr.next=curr.next.next;
            curr.next.next=temp1;
            curr.next.next.next=temp2;
            curr=curr.next.next;
        }
        return dm.next;
    }
}

    首先我们先建立一个虚拟头结点,然后定义一个curr节点指定这个虚拟头结点。然后判断该节点后两个节点是否为空,不为空可以开始交换了。先用两个变量记住图中1,3节点,按照上面交换进行,curr指向2节点,2节点指向1节点,1节点指向3节点,最后将当前节点位置向后移动两位,就可以开始交换下两个节点的位置了。

    其实还有递归方法可以解决,代码如下:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
        return next;
    }
}

    怎么样,模拟以后是不是感觉简单很多了,很多题目需要自己动手去尝试!!!