题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4], 输出:[2,1,4,3]
示例 2:
输入:head = [],输出:[]
示例 3:
输入:head = [1],输出:[1]
提示:链表中节点的数目在范围 [0, 100] 内, 0 <= Node.val <= 100
题解
创建哑结点 dummyHead,令 dummyHead.next = head。令 temp 表示当前到达的节点,初始时 temp = dummyHead。每次需要交换 temp 后面的两个节点。
如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
/*if(head == nullptr || head ->next == nullptr){
return head;
}*/
ListNode* dummyHead = new ListNode(0);
dummyHead ->next = head;
ListNode* temp = dummyHead;
while(temp ->next != nullptr && temp ->next ->next != nullptr){//当前达到的结点temp后面有两个结点, 才需要进行交换
ListNode* node1 = temp -> next;
ListNode* node2 = temp ->next->next;
temp ->next = node2;
node1 ->next = node2 ->next;
node2 ->next = node1;
temp = node1;
}
return dummyHead ->next;
}
};
复杂度分析
- 时间复杂度:O(n),其中 n 是链表的节点数量。需要对每个节点进行更新指针的操作。
- 空间复杂度:O(1)。
参考
两两交换链表中的节点
24. 两两交换链表中的节点:【交换节点】详解
352,数据结构-2,链表
递归就能不讲武德了吗
动画演示 迭代+递归 24. 两两交换链表中的节点