【C++算法】52.链表_两两交换链表中的节点
文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
24. 两两交换链表中的节点
题目描述:
解法
解法一:递归
解法二:循环
C++ 算法代码:
/**
* 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* newHead = new ListNode(0);
newHead->next = head;
// 初始化四个指针用于交换操作
ListNode* prev = newHead; // 指向要交换的两个节点的前一个节点
ListNode* cur = prev->next; // 指向第一个要交换的节点
ListNode* next = cur->next; // 指向第二个要交换的节点
ListNode* nnext = next->next; // 指向交换完成后的下一对节点的第一个节点
// 当有一对节点可以交换时继续循环
while(cur && next)
{
// 交换节点:更改指针指向,实现两两交换
prev->next = next; // 前一个节点指向第二个节点
next->next = cur; // 第二个节点指向第一个节点
cur->next = nnext; // 第一个节点指向下一对节点的第一个节点
// 更新指针,准备处理下一对节点
prev = cur; // 更新prev指向当前已交换的第一个节点
cur = nnext; // 更新cur指向下一对的第一个节点
if(cur) next = cur->next; // 如果cur存在,更新next
if(next) nnext = next->next; // 如果next存在,更新nnext
}
// 获取结果链表的头节点(跳过虚拟头节点)
cur = newHead->next;
delete newHead; // 释放虚拟头节点的内存
return cur; // 返回新的头节点
}
};