C++翻转链表

C++反转链表完整代码 #include<iostream> using namespace std; struct ListNode { int val; ListNode* next; }; //反转链表 ListNode* reverseList(ListNode* pHead) { if (!pHead || !pHead->next) return pHead; ListNode* tail = reverseList(pHead->next); pHead->next- 阅读详情

1 题目描述

2 解题思路与代码

用三个指针解决,curr用于遍历链表,next是curr得后一个结点的指针,prev是curr的前一个结点的指针。

三个指针初始化:

prev初始化为nullptr

next初始化为nullptr

curr初始化为pHead即链表头结点

思路:curr指向当前结点,负责把当前结点的next指针从指向下一个结点改变为指向上一个结点,为了将整个链表翻转,curr必须遍历每一个结点,并将其指针域改为指向上一个结点。next指针用于在curr改变其指针域指向之前先记录下curr的下一个结点,如果没有next指针记录的话,直接把curr的next指向上一个结点会导致链表断了,即找不到了下一个结点,这样curr就没办法遍历链表了。prev永远指向curr的上一个结点,这也是为什么prev初始化为nullptr,因为首元结点上边已经没有结点了。

因此循环体的逻辑是:

进入循环体的时候

prev正指向curr的上一个结点

用next先记录下curr的下一个结点

将curr的指针域指向prev指向的结点,即curr得上一个结点,这个时候curr指向的结点将会是下次循环中的“上一个”结点

令prev等于curr,即记录下当前结点,即下一次循环的上一个结点

令curr=next,遍历链表中下一个结点

返回值:

因为我们是用curr作为循环条件的,最后一次遍历的时候curr指向nullptr,而prev正指向curr的上一个结点,即反转后链表的首元节点,因此返回prev。

#include <bits/stdc++.h>
using namespace std;


typedef struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x):val(x),next(NULL){}
}ListNode;

ListNode* ReverseList(ListNode* head){
    ListNode *prev = NULL;
    ListNode *next = NULL;
    ListNode *cur = head;

    while(cur){ // cur用来遍历链表,当cur等于NULL的时候说明最后一个链表也已经翻转过了
        next = cur->next; // 在把当前结点指针转换方向之前,一定要先把指针域备份一下,不然就找不到需要翻转的下一个结点了
        cur->next = prev; // 上一句已经记录了下一个结点的指针,所以可以放心把当前结点指针域翻转,指向上一个结点
        prev = cur; // 对于下一个结点来说,当前结点就是就是它的上一个结点,prev之中记录上一个结点的指针
        cur = next; // 可以翻转下一个结点的指针域了
    }

    return prev; // while循环结束的时候,cur指向NULL,即最后一个结点的下一个,那么prev指向的就是最后一个结点,也就是翻转后链表的头结点
}

int PrintList(ListNode *head){
    while(head != NULL){
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");
    return 0;
}

int main(){
    ListNode node0(0);
    ListNode node1(1);
    ListNode node2(2);
    ListNode node3(3);

    ListNode *head = &node0;
    node0.next = &node1;
    node1.next = &node2;
    node2.next = &node3;
    node3.next = NULL;

    PrintList(head);
    head = ReverseList(head);
    PrintList(head);
    return 0;



}

3 扩展------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:
    // head是一组链表的首元节点,head_next是下一组链表的首元节点
    // 该函数翻转一组k个节点
    ListNode *reverse(ListNode *head, ListNode *head_next){
        ListNode *prev = nullptr;
        ListNode *next = nullptr;
        ListNode *curr = head;
        while(curr != head_next){
            next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;

    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode *head_next = head;
        for(int i = 0; i < k; ++i){ // 注意这里滑动k次,因此循环完毕curr指向第k+1个节点,即下一组节点的首元节点
            if(head_next == nullptr) return head;
            head_next = head_next->next;
        }

        ListNode *new_head = reverse(head, head_next);
        head->next = reverseKGroup(head_next, k); // head是第一组节点翻转以后的最后一个节点,负责和下边的翻转链表连接起来
        return new_head;


    }
};

C/C++ 链表翻转(单链表) 本人设计的链表翻转(单链表),含增删查改全部代码,接口基本复制过去就能用了 如果发现错误欢迎指正! 翻转具体代码在本文最后一个函数中 #include <iostream> using namespace std; struct node { int data; struct node* next; }; void inser_node(struct node *head,int data) { struct node *new_node = new str. 阅读详情

相关推荐

LeetCode系列之【25. K 个一组翻转链表】C++ 每天一道leetcode!

目录(快速导航) 题目描述 视频讲解https://www.bilibili.com/video/av66440465/ 思路 代码 题目描述: 题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数,它的值小于或等于链表的长...

qq_28410301的博客 1074

反转链表的4种方法c++实现

1

wodazhouyi的博客 1万+

别再傻傻分不清:PX4、Pixhawk、ArduPilot、APM到底啥关系?一张图给你讲明白

本文全面解析开源飞控领域核心概念,厘清PX4、Pixhawk、ArduPilot与APM的定位与关系。通过硬件平台演进史和飞行控制软件对比,帮助开发者理解开源飞控生态,并提供新项目开发建议与特殊需求考量,助力无人机开发中的明智选择。

weixin_32770423的博客 411

【C++算法】:反转链表

【代码】【C++算法】:反转链表。

W_Oilpicture的博客 3399

i2c转串口驱动移植

i2c转串口驱动移植欢迎使用Markdown编辑器新的改变思路与使用方式合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M

mars_Vessalius的博客 2276

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

C++链表02:反转链表

1.背景 大家好,我是酒馆店小二。 力扣206.翻转链表。 题意:反转一个单链表。 示例: 输入: 2->3->4->5->NULL 输出: 5->4->3->2->NULL 2.迭代 如图, 定义pre指针,初始化为 nullptr; 定义cur指针,指向头结点; 定义temp指针,指向cur->next节点,为什么要指向这个节点?因为接下来要改变cur->next的指向,将cur->next指向pre; 重复执行上述操作,不断后移p

qq_43700779的博客 4886

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 727

一文带你深入浅出C语言函数

数学中我们常见到函数的概念。但是你了解C语言中的函数吗? 本文主要分享个人关于C语言函数的学习见解,水平有限,难免会有纰漏,读者各取所需即可。

桦楸静的博客 1432

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2171

【AI智能体】Skills 智能体驱动开发从使用到项目实战详解

Skills 智能体驱动开发从使用到项目实战详解

congge 6601

leetcode C++ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

一、思路: 先实现两个节点翻转,再实现k个节点翻转,最后实现一组一组翻转 二、C++代码: class Solution { public: ListNode* swap(ListNode *f1, ListNode *f2, int count) { ListNode *nowNode = f2; ListNode *f3, *l1, *l2 = NULL, *...

cysisu的博客 1004

msfvenom制作windows/linux/android/ios木马

msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使

Cwillchris的博客 2732

(刷题学习)C++从翻转链表到k个一组翻转链表

从翻转链表到k个一组翻转链表

weixin_51334923的博客 747

103.在 Vue 3 中使用 OpenLayers 控制图层来显示/隐藏地图

是一个强大的开源库,可以用于构建各种地理信息系统应用。在 Vue 3 中,我们可以结合。方法,可以直接控制某个图层是否可见,而不需要删除或重新创建图层。在开始之前,确保你已经搭建了 Vue 3 项目,并安装了。本文将详细介绍如何在 Vue 3 组合式 API (,并实现按钮控制地图的显示/隐藏功能。会导致 OSM 瓦片地图无法加载。方法控制地图图层的显示与隐藏。安装完成后,即可开始编写代码。在本教程中,我们介绍了如何在。来实现地图的显示/隐藏功能。来实现交互式地图,并通过。在 WebGIS 开发中,

小彭的博客 1560

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点

c++链表获取长度,链表翻转, 查找链表倒数第K个节点以及中间点 测试数据 ListNode* pHead = new ListNode(); pHead->m_key = 1; ListNode* pNode = pHead; for (int i = 2; i <= 5; i++) { ListNode* pNew = new ListNode(); pNew->m_key = i; pNew->pNext = nullptr; pNode->pNe

Tang_AHMET的博客 6362

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++&Python描述 LeetCode 25. K 个一组翻转链表

C++&Python描述 LeetCode 25. K 个一组翻转链表   大家好,我是亓官劼(qí guān jié ),在公众号、优快云、GitHub、B站、华为开发者论坛等平台分享一些技术博文,全平台的id皆为:亓官劼(qí guān jié ),除以上平台,其他的亓官劼id都不是本人,有不少网站在冒充,注意甄别。 放弃不难,但坚持一定很酷!时光荏苒,未来可期,一起加油~   建了个小交流群,Q群:545611263,要进微信群的

一起加油 1683

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

6-4 翻转链表(C++版) (25分)

6-4 翻转链表(C++版) (25分) 本题要求实现翻转一个链表的功能。链表类ListNode的定义已经给出。要求在Solution类中给出有关函数的实现。 输入样例: 10 81 70 49 70 88 84 51 65 60 59 输出样例: 59 60 65 51 84 88 70 49 70 81 只有23分,有一个数据点答案错误,希望大家指正 #include<iostream> using namespace std; class ListNode { public: in

olssa的博客 1278

LeetCode 算法:K 个一组翻转链表 c++

LeetCode 算法:K 个一组翻转链表 c++

世界那么大,我想去看看~【随心更新,看世界去了😄】 1558

C++翻转链表设计图解循环过程

双指针法(cur与pre):利用三个节点指针完成翻转,cur初始化为头指针,pre为辅助指针。tmp保存下次cur所指的位置。while循环里的过程在图解中体现。

qq_44857420的博客 522

【C++算法】55.链表_K个一组翻转链表

【代码】【C++算法】55.链表_K个一组翻转链表。

hlyd520的博客 550

C++算法:K个一组翻转链表---递归+循环

题目: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 当 k = ...

ZHAO 1002

链表的C++创建及翻转

以前感觉建立一个链表太简单不过了,但是当真正去实现的时候真让人奔溃。好不容易才实现,记录下来。 翻转就容易多了,记住不要吝惜定义指针,不要想着两个指针能不能实现,不要总想搞个大事情。

布衣书生的博客 387

Leetcode 力扣hot100 ——K 个一组翻转链表C++题解

基于C++的K 个一组翻转链表题解,空间复杂度o(1)。

qq_44880368的博客 1073

链表中的节点每k个一组翻转(c++实现)

LRU c++ 哈希双链表法实现 leetcode link 牛客 link 以牛客这个题目表述写的: 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 [要求] set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。

页页读 1406

25_k个一组翻转链表C++

递归。需要用到O(N)存储空间 class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { if (head == NULL) return head; ListNode* left, *right,*newHead; stack<ListNode*> s; left = head; right = head; s.push(left); int i = k-1; w

sakumashirayuki的博客 220
上一篇: socket编程步骤
下一篇: 二叉树的遍历
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值