「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
两两交换链表中的节点
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。(只能进行节点交换)
示例1:
输入:head=[1,2,3,4]
输出:[2,1,4,3]
示例2:
输入:head=[]
输出:[]
示例3:
输入:head=[1]
输出:[1]
解析
首先我们来模拟一下节点交换的过程:
这里以[1,2,3,4]为例,在进行节点交换之前我们可以设置一个虚拟头结点。
在这里设置一个虚拟头结点,方便原链表中所有结点可以按照统一的方式进行各项操作,而不用单独处理原来头结点,使得操作更为方便
第一步:初始状态下,pre指向虚拟头结点
第二步:交换1和2两个元素,注意这时的操作步骤,首先将头结点的next指针指向结点2,再将结点2的next指针指向结点1,最后将结点1的next指针指向结点2后面的结点,即结点3,上述步骤具体如下图(a)、图(b)、图(c)所示
以上就是结点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;
}