LeetCode 24. 两两交换链表中的节点 c++/java详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 24. 两两交换链表中的节点 c++/java详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[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),其中 n n n是链表的节点数量。
3、c++代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode(-1); //虚拟头节点
dummy->next = head;
for(auto p = dummy; p->next && p->next->next; )
{
auto a = p->next, b = a->next;
p->next = b;
a->next = b->next;
b->next = a;
p = a;
}
return dummy->next;
}
};
4、java代码
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;
}
}
原题链接: 24. 两两交换链表中的节点
以上是关于LeetCode 24. 两两交换链表中的节点 c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章