链表 -- 反转链表,k个一组翻转链表,两两交换链表中结点

devtools/2025/1/17 17:56:02/

目录

反转链表

题目

​编辑

分析

代码

k个一组翻转链表

题目

分析

代码

两两交换链表中的结点

题目

​编辑

分析

代码


反转链表

题目

分析

反转过程:

  • newhead作为遍历指针,最终停在尾结点上
  • prev保存上一个结点,通过改变newhead和prev的连接来实现反转(核心)
  • 通过next保存原链表下一个结点,防止反转连接关系后找不到原结点

经过一轮循环后,第一个和第二个结点的连接成功反转,之后就不断循环该过程,直到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* reverseList(ListNode* head) {ListNode *pre = nullptr, *next = head;while (next) {next = head->next;head->next = pre;pre = head;head = next;}return pre;}
};

实在记不住原理,可以记代码:

  • 首先定义前后继指针
  • 循环条件:后继结点指向空
  • 循环体:后继指针指向下一个结点,prev指引head->next的指向关系,prev跟着head走,head跟着next走

注意等号两边是对称的嗷: 

k个一组翻转链表

题目

分析

还是基于反转链表的思路,难点在于先筛选出k个结点作为一组再进行反转 + 如何将若干组进行链接

  • 可以考虑进行递归,将大问题拆分成若干小问题 -- 也就是代码内只进行一组的反转,反转后将新的头尾结点传递给其他部分
  • 详细来说,头结点需要传递给前面部分(作为返回值返回),尾结点需要主动让后面部分来链入(接收函数的返回值)

代码

/*** 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* reverseKGroup(ListNode* head, int k) {ListNode* tmp = head;//查看当前是否还有k个剩余结点for (int i = 0; i < k; ++i) {if (tmp == nullptr) {return head;}tmp = tmp->next;}//对当前这四个结点进行反转ListNode *pre = nullptr, *next = head, *cur = head;while (cur != tmp) {next = cur->next;cur->next = pre;pre = cur;cur = next;}//反转后,head成为新的尾结点,来链入后续部分head->next = reverseKGroup(tmp, k);//返回给前面部分新的头结点return pre;}
};

两两交换链表中的结点

题目

分析

类似于上道题的思路,只是更简单了一点 -- 因为不需要进行组内反转了

  • 相当于直接给出了新的头尾结点
  • 依然可以将两个结点看为一组,只需要重新对二者进行链接,然后将头结点返回,尾结点接收返回值就行

代码

/*** 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) {return nullptr;}if (head->next == nullptr) {return head;}ListNode *new_head = head->next, *next = new_head->next;head->next = swapPairs(next);new_head->next = head;return new_head;}
};


http://www.ppmy.cn/devtools/151324.html

相关文章

Kubernetes 部署 RabbitMQ 集群教程

本文介绍如何在 Kubernetes 中部署 RabbitMQ 集群&#xff0c;包含从命名空间创建到配置 NFS 存储的详细步骤。 参考文档&#xff1a; RabbitMQ 集群部署NFS StorageClass 创建 部署步骤 1. 创建命名空间 kubectl create ns rabbitmq2. 创建 RBAC 权限 创建文件 rabbitmq…

力扣 394. 字符串解码

&#x1f517; https://leetcode.cn/problems/decode-string 题目 对字符串中的 k[s] 解码为 s 重复 k 次 思路 碰到数字&#xff0c;开始进行递归 decode 展开&#xff0c;否则字符不解码针对于解码的部分&#xff0c;先明确 k 的数字是多少&#xff0c;再明确 [ ] 括号中…

精通Python (10)

一&#xff0c;基于tkinter模块的GUI GUI是图形用户界面的缩写&#xff0c;图形化的用户界面对使用过计算机的人来说应该都不陌生&#xff0c;在此也无需进行赘述。Python默认的GUI开发模块是tkinter&#xff08;在Python 3以前的版本中名为Tkinter&#xff09;&#xff0c;从这…

2025-1-15-十大经典排序算法 C++与python

文章目录 十大经典排序算法比较排序1. 冒泡排序2. 选择排序3. 插入排序4. 希尔排序5. 归并排序6. 快速排序7. 堆排序 非比较排序8. 计数排序9. 桶排序10. 基数排序 十大经典排序算法 十大经典排序算法可以分为比较排序和非比较排序: 前者包括冒泡排序、选择排序、插入排序、希…

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…

microPython搭建webServer--(三)使用microdot库实现用户提交设定后断电保存

很多用esp32diy的产品中&#xff0c;用户需要在首次使用时设定好wifi参数&#xff0c;基本思路就是开机之后&#xff0c;esp32自身作为热点&#xff0c;用户连接此热点后&#xff0c;访问网页设定参数&#xff0c;esp32将参数存入自身&#xff0c;保证断电保存。重启后&#xf…

深度学习blog-剪枝和知识蒸馏

深度学习网络模型从卷积层到全连接层存在着大量冗余的参数&#xff0c;大量神经元激活值趋近于0&#xff0c;将这些神经元去除后可以表现出同样的模型表达能力&#xff0c;这种情况被称为过参数化。因此需要一些技术手段减少模型的复杂性&#xff0c;去除一些不重要的参数和连接…

python mysql库的三个库mysqlclient mysql-connector-python pymysql如何选择,他们之间的区别

三者的区别 1. mysqlclient 特点&#xff1a; 是一个用于Python的MySQL数据库驱动程序&#xff0c;用于与MySQL数据库进行交互。 依赖于MySQL的本地库&#xff0c;因此在安装时需要确保系统上已安装了必要的依赖项&#xff0c;如libmysqlclient-dev等。 性能较好&#xff0c…