【力扣】两两交换链表中的节点

119 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

两两交换链表中的节点

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。(只能进行节点交换)
示例1:

002.png

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

示例2:

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

示例3:

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

解析

首先我们来模拟一下节点交换的过程:
这里以[1,2,3,4]为例,在进行节点交换之前我们可以设置一个虚拟头结点。

在这里设置一个虚拟头结点,方便原链表中所有结点可以按照统一的方式进行各项操作,而不用单独处理原来头结点,使得操作更为方便
第一步:初始状态下,pre指向虚拟头结点

0001.jpg
第二步:交换1和2两个元素,注意这时的操作步骤,首先将头结点的next指针指向结点2,再将结点2的next指针指向结点1,最后将结点1的next指针指向结点2后面的结点,即结点3,上述步骤具体如下图(a)、图(b)、图(c)所示

0002.jpg

0003.jpg

0004.jpg
以上就是结点1和结点2交换的过程,我们根据上述过程编写代码逻辑

代码

public ListNode swapPairs(ListNode head) {
        //设置虚拟头结点
        ListNode dummyNode=new ListNode(0);
        //虚拟头结点指向head,这样操作起来更为方便
        dummyNode.next=head;
        ListNode pre=dummyNode;
        //链表非空时进行操作
        while(head!=null&&head.next!=null){  
            //定义临时结点存储结点2
            ListNode temp=head.next.next;
            //pre的next指向head的next
            pre.next=head.next;
            //结点1和2交换位置
            head.next.next=head;
            head.next=temp;
            //pre和head移动一位,准备下一轮交换
            pre=head;
            head=head.next;
        }
        return dummyNode.next;
    }