ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【优选算法专栏】专题九:链表--------两两交换链表中的节点

【优选算法专栏】专题九:链表--------两两交换链表中的节点

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题九

  • 题目来源
  • 题目解析
  • 算法原理
  • 代码实现

题目来源

本题来源为:

Leetcode24. 两两交换链表中的节点

题目解析

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
在这里插入图片描述
在这里插入图片描述

算法原理

本题的算法还是模拟

首先画一下图:
在这里插入图片描述
这里我们会发现,要是两两进行交换,会影响四个节点的位置,因此我们要定义四个变量:
在这里插入图片描述
画图观察,交换后每个节点的指向就十分明确。

那么什么时候循环结束呢?
分两种情况:
在这里插入图片描述

  1. 节点个数为偶数时:
    在这里插入图片描述
    cur为空时结束循环
  2. 节点个数为奇数时:
    在这里插入图片描述
    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;}
};
返回列表