「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100
题目链接:[两两交换链表中的节点](leetcode-cn.com/problems/ge…)
思路介绍
题目分析
递归的终止条件是链表中没有节点,或者链表中只有一个节点。
直接通过递归交互即可,返回的结果为交换后的新链表,每次递归交换相邻的两个节点即可。
如果原来链表中有两个节点以上的节点,就将原链表中的第二个节点先存起来。 将第二个节点后面的链表进行递归。 再进行链表的交换操作:将原链表的第一个节点变成新链表的第二个节点,原链表的第二个节点变成新链表的第一个节点。
再将链表中元素两两交换之后就完成操作。最后返回原链表的第二个节点即可。
具体过程详解:
1、首先定义p = dummy,a = p->next,b = a->next。
2、遍历整个链表,第一步先将p的next指针指向b,即p->next = b。
3、然后将a的next指向b->next,即a->next = b->next。
4、最后将b的next指向a,即b->next = a。
经过上述操作以后,我们就成功交换了a,b节点,然后让p指向a节点,重复上述操作即可。
5、最后返回虚拟头节点的下一个节点
代码
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
for(ListNode p = dummy; p.next != null && p.next.next != null;)
{
ListNode a = p.next; //虚拟头节点
ListNode b = a.next;
p.next = b;
a.next = b.next;
b.next = a;
p = a;
}
return dummy.next;
}
}
运行结果
执行结果:通过
执行用时:0 ms
内存消耗:38.9 MB