「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」
1、题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
1 | ini复制代码输入:head = [1,2,3,4] |
示例 2:
1 | ini复制代码输入:head = [] |
示例 3:
1 | ini复制代码输入:head = [1] |
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
2、思路
(模拟) O(n)O(n)O(n)
题目给定一个链表,要求我们两两交换其中相邻的节点,并返回交换后的链表。由于可能会对头节点进行改变,因此需要建立一个虚拟头结点dummy
,指向原来的头节点。
根据题意进行模拟迭代,两两交换相邻两个结点,如下图所示:
具体过程详解:
- 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、最后返回虚拟头节点的下一个节点
时间复杂度分析: O(n)O(n)O(n),其中 nnn是链表的节点数量。
3、c++代码
1 | c复制代码class Solution { |
4、java代码
1 | java复制代码class Solution { |
原题链接: 24. 两两交换链表中的节点
本文转载自: 掘金