本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。
💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识
专题九
- 题目来源
- 题目解析
- 算法原理
- 代码实现
题目来源
本题来源为:
Leetcode24. 两两交换链表中的节点
题目解析
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
算法原理
本题的算法还是模拟
首先画一下图:
这里我们会发现,要是两两进行交换,会影响四个节点的位置,因此我们要定义四个变量:
画图观察,交换后每个节点的指向就十分明确。
那么什么时候循环结束呢?
分两种情况:
- 节点个数为偶数时:
cur为空时结束循环 - 节点个数为奇数时:
next为空时,循环结束
代码实现
/**
* 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,*cur=prev->next,*next=cur->next,*nnext=next->next;
while(cur&&next)
{
//交换节点:
prev->next=next;
next->next=cur;
cur->next=nnext;
//修改节点:
prev=cur;
cur=nnext;
//注意非法访问
if(cur)
next=cur->next;
if(next)
nnext=next->next;
}
cur=newhead->next;
delete newhead;
return cur;
}
};