小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
示例 2:
输入: head = []
输出: []
示例 3:
输入: head = [1]
输出: [1]
图解:
交换一次的流程图
CODE:
#include <iostream>
using namespace std;
/**
* 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) {}
* };
*/
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)
{
// 添加虚拟头节点
ListNode *dummy = new ListNode(0);
dummy->next = head;
// 当前指针指向虚拟头节点
ListNode *cur = dummy;
// 向后遍历交换节点
while (cur->next != nullptr && cur->next->next != nullptr)
{
// 记录每次需要交换的第一个节点(共记录两个)
ListNode *tmp = cur->next;
ListNode *tmp1 = cur->next->next->next;
// 步骤1
cur->next = cur->next->next;
// 步骤2
cur->next->next = tmp;
// 步骤3
cur->next->next->next = tmp1;
// 交换一次完成,更新cur指针指向的位置
cur = cur->next->next;
}
// 交换完位置后删除虚拟头节点
head = dummy->next;
delete dummy;
return head;
}
void printListNode(ListNode *head)
{
ListNode *cur = head;
while (cur)
{
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
};
int main()
{
ListNode *head = new ListNode(1);
ListNode *p1 = new ListNode(2);
ListNode *p2 = new ListNode(3);
ListNode *p3 = new ListNode(4);
head->next = p1;
p1->next = p2;
p2->next = p3;
Solution solu;
ListNode *newHead = solu.swapPairs(head);
solu.printListNode(newHead);
return 0;
}