本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。
💓博主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;}
};