首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C++中实现一个反转链表的函数的问题

在C++中实现一个反转链表的函数可以通过迭代或递归的方式来完成。

  1. 迭代方法:
代码语言:txt
复制
#include <iostream>

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

ListNode* reverseList(ListNode* head) {
    ListNode* prev = nullptr;
    ListNode* curr = head;
    while (curr != nullptr) {
        ListNode* nextTemp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

int main() {
    // 创建链表
    ListNode* head = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);
    ListNode* node4 = new ListNode(4);
    ListNode* node5 = new ListNode(5);
    head->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;

    // 反转链表
    ListNode* reversedHead = reverseList(head);

    // 输出反转后的链表
    ListNode* curr = reversedHead;
    while (curr != nullptr) {
        std::cout << curr->val << " ";
        curr = curr->next;
    }
    std::cout << std::endl;

    // 释放链表内存
    curr = reversedHead;
    while (curr != nullptr) {
        ListNode* temp = curr;
        curr = curr->next;
        delete temp;
    }

    return 0;
}

输出结果为:5 4 3 2 1

  1. 递归方法:
代码语言:txt
复制
#include <iostream>

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

ListNode* reverseList(ListNode* head) {
    if (head == nullptr || head->next == nullptr) {
        return head;
    }
    ListNode* reversedHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return reversedHead;
}

int main() {
    // 创建链表
    ListNode* head = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);
    ListNode* node4 = new ListNode(4);
    ListNode* node5 = new ListNode(5);
    head->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;

    // 反转链表
    ListNode* reversedHead = reverseList(head);

    // 输出反转后的链表
    ListNode* curr = reversedHead;
    while (curr != nullptr) {
        std::cout << curr->val << " ";
        curr = curr->next;
    }
    std::cout << std::endl;

    // 释放链表内存
    curr = reversedHead;
    while (curr != nullptr) {
        ListNode* temp = curr;
        curr = curr->next;
        delete temp;
    }

    return 0;
}

输出结果为:5 4 3 2 1

以上是在C++中实现反转链表的函数的两种方法。这个函数可以用于将一个单向链表的顺序反转,使得链表的尾部成为头部,头部成为尾部。反转链表在实际开发中常用于解决一些与链表相关的问题,例如链表的遍历、查找、插入、删除等操作。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云内容分发网络(CDN):https://cloud.tencent.com/product/cdn
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
  • 腾讯云音视频处理(VOD):https://cloud.tencent.com/product/vod
  • 腾讯云元宇宙(Tencent Real-Time Rendering):https://cloud.tencent.com/product/trtr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

链表反转分析及实现

我先画一个链表,这个单链表有4个元素。我思路就是,每次把第二个元素提到最前面来。...思路也差不多,不过你current一直是表一个结点,我这里current始终是首元结点值,我函数需要每次对pnext重新赋值。一会解释下。...这个是程序运行结果。 image.png 最后附上完整代码,反转有两个函数。 方法1,current始终保持第一位,pnext与prev遍历并完成交换。...printf("\n1.整表创建(头插法) \n2.整表创建(尾插法) \n3.遍历操作 \n4.插入操作"); 254 printf("\n5.删除操作 \n6.获取结点数据 \n7.查找某个数是否链表...case '0': 332 exit(0); 333 } 334 } 335 return 0; 336 } 有两个方法可以实现链表反转

2.2K100

c++链表-C++实现简单链表

链表是最常用一种数据结构,无论什么语言,学习数据结构,都绕不开链表,下面通过c++实现简单链表,所谓简单链表,就是构建链表,然后遍历打印链表。   ...c++构建链表,最简单是使用结构体来定义节点,节点定义很简单:节点数据,下一个节点c++链表,这就是链表全部,另外,为了通过new时候,直接创建一个节点,我们可以通过定义一个带参数构造函数实现...链表结构体定义如下:   这里,我们通过循环来构建一个简单链表链表节点数据就是一个数组[0,1,2,3,4]各个元素:   如下图所示,这种简单构建方式,构建链表过程是一种特殊构建方式c++...接下来,就实现链表遍历,遍历很简单,从头节点开始,如果节点不为空,依次打印节点数据,并且当前节点需要切换到下一个节点开始,继续遍历:   运行程序,不出意外的话,打印结果应该是:4->3->2->1...我们可以 按照常规办法来构建链表,同样是循环插入数据,不过这时候需要新增一个指针,来记录当前节点,我们不能再使用头结点来做插入。

81010

如何使用Java实现链表插入、删除和反转

链表是一种常见数据结构,它由一个个节点组成,每个节点包含一个数据元素和指向下一个节点引用。Java,可以使用类来表示链表节点,然后使用这些节点构建链表实现插入、删除和反转等操作。...(); } } 以上代码,我们定义了一个LinkedList类,其中包含了插入、删除和反转等操作。...从头节点开始,每次迭代,将当前节点next指向前一个节点,然后将当前节点和前一个节点都向后移动一位,直到当前节点为空。 printList方法用于打印链表元素。...我们从头节点开始遍历链表,并依次打印每个节点值。 main方法,我们创建了一个LinkedList对象,并对其进行了一些操作演示。首先,我们插入了一些节点,然后打印原链表。...接着,我们删除了一个节点,并打印删除节点后链表。最后,我们对链表进行反转,并打印反转链表。 通过以上代码,我们实现链表插入、删除和反转等操作。

8010

【剑指Offer专题】链表系列:从尾到头打印链表反转链表、回文链表、合并两个排序链表C++和Python实现

每经过一个结点时候,把该结点放到一个。当遍历完整个链表后,再从栈顶开始逐个输出结点值,给一个链表结构,这样链表实现反转。...反转一个链表。...遍历列表时,将当前节点 next 指针改为指向前一个元素. 2、代码 C++: /** * Definition for singly-linked list.... Python ,很容易构造一个列表反向副本,也很容易比较两个列表。因此最好使用双指针法来检查是否为回文。...两个链表都是排序好,我们只需要从头遍历链表,判断当前指针,哪个链表值小,即赋给合并链表指针即可。使用递归就可以轻松实现

82010

每日算法刷题Day14-反转链表、两个链表一个公共结点、删除链表重复节点

文章目录 42.反转链表 数据范围 样例 思路 43.两个链表一个公共结点 数据范围 样例 空节点三种写法 思路 44.删除链表重复节点 数据范围 样例1 样例2 思路 42.反转链表 定义一个函数...,输入一个链表头结点,反转链表并输出反转链表头结点。...思考题: 请同时实现迭代版本和递归版本。 数据范围 链表长度 [0,30]。...分别定义头节点和下一个节点 采用移位方式依次连接 先存储q节点指向 再让q节点指向前节点p 然后移动q节点到其下一个节点处 最后移动p节点到q节点处即可,保证其先后顺序 最后将其头节点指向空即可...一个排序链表,存在重复节点,请删除该链表重复节点,重复节点不保留。

35410

C++exec()函数

exec()函数C++一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程代码和数据,创建新进程运行其他程序。...常见fork()调用例子有很多,比如从 wechat发起一个语音电话、从 bash或者zsh执行一个 a.out 程序,都是利用exec系统调用将新产生子进程完全替换成目标进程。...,包括路径名; arg参数表示启动程序所带参数,一般第一个参数为要执行命令名 返回值:成功返回0,失败返回-1 上述exec系列函数底层都是通过execve系统调用实现: #include <unistd.h...在这里参数传递方式是以函数第5位字母来区分,字母为“l”(list)表示逐个列举方式,字母为“v”(vertor)表示将所有参数整体构造成指针数组传递,然后将该数组首地址当做参数传给它,数组最后一个指针要求是...这里以“e”(environment)结尾两个函数execle、execve就可以envp[]中指定当前进程所使用环境变量替换掉该进程继承所以环境变量,这极大地提供了灵活度。

20920

链表实现在PHP

开始对数据结构学习 今天写代码换了一个字体,以前一直用console很好看,今天发现一个更喜欢风格Source Code Pro 上两张图,还是挺好看!!!...Source Code Pro Source Code Pro 步入正题,讲讲链表操作 节点 首先得有一个节点类,用于存储数据 <?...(用于操作节点数据) 操作类代码由于太长,我们分部分解析 头插入(因为比较简单,所以先讲这个) 听名字,就知道是从头部插入一个节点 当链表为空,则初始化当前节点 当链表不为空,把新节点作为头结点 public...当前索引等于传入参数索引 // 2. 实例化新数据节点 // 3. 新节点一个指向当前节点一个节点 // 4....,只要遍历即可 /** * 查找链表索引 * 成功返回索引值,找不到返回 -1 * * @param int $data * @return int */ public function find

8610

python实现将range()函数生成数字存储一个列表

说明 同学代码遇到一个数学公式牵扯到将生成指定数字存储一个列表,那个熊孩子忽然懵逼不会啦,,,给了博主一个表现机会,,,哈哈哈好嘛,虽然很简单但还是记录一下吧,,,嘿嘿 一 代码 # coding...好嘛,,,有没有很神奇节奏! 补充知识:Python 通过range初始化list set 等 啥也不说了,还是直接看代码吧!...""" 01:range()函数调查 02:通过help()函数调查range()函数功能 03:Python转义字符 04:使用start、step、stop方式尝试初始化list、tuple、...set.add {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a'} tempSet.add('a') print("set.add " + str(tempSet)) 以上这篇python实现将...range()函数生成数字存储一个列表中就是小编分享给大家全部内容了,希望能给大家一个参考。

4.3K20

C++函数多态实现原理刨析

多态实现原理刨析 虚函数关键字:virtual 未写virtual关键字前: #include using namespace std; class Animal { public...深入探究多态实现原理前,先要理解多态意思和虚函数实现条件 多态: 不同类对象对同一消息不同响应 注意: 虚函数实现条件 : 1.有继承关系 2.子类重写父类函数 动态多态使用...: 父类指针或者引用指向子类对象 多态实现原理探究: 未写虚函数前: #include using namespace std; class Animal { public:...未写虚函数前,空对象a大小为1,写了虚函数后,对象a大小为4,是因为此时a里面存放了一个vfptr虚函数(表)指针,指针大小无论类型均为4个字节大小 该虚函数指针指向一个函数表 当子类未重写父类虚函数时...当发生虚函数重写时,子类会把自己函数覆盖掉之前父类函数 因此当父类指针或者引用指向子类对象时候,会发生多态,你传入是cat对象,就去cat函数找speak函数入口地址

43710

链表C++实现(采用模板类)

采用模板类实现好处是,不用拘泥于特定数据类型。就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表定义和相关操作。   ...本文采用是第4种结构类型 /************************************************************************* 1、复合类:Node类定义友元方式...private:     LinkNode *head; };  单链表模板类定义 使用模板类需要注意一点是template必须定义一个文件,否则编译器会无法识别。...如果在.h声明类函数,但是.cpp定义函数具体实现, 会出错。所以,推荐方式是直接在.h定义。...delete p; } } 求链表长度和打印链表 着两个功能实现非常相近,都是遍历链表结点,不赘述。

2.4K70

定义一个函数函数可以实现任意两个整数加法。java实现

上面都是抛砖引玉,现在正式讲解这道题拓展题解法。 题目:定义一个函数函数可以实现任意两个整数加法。...对于这道题,由于没有限定输入两个数范围,我们要按照大数问题来处理。由于题目是要求实现任意两个整数加法,我们就要考虑如何实现大数加法。此外这两个整数是任意,所以也有可能存在负数。...当两个整数都是正数时候直接相加结果为正数,同为负数时候取两者绝对值相加然后结果前加一个负号。...假若是一正一负,则用两者绝对值相减,用绝对值大数减去绝对值小数,当正数绝对值大时候相减结果为正数,当负数绝对值大时候相减结果为负数,结果为负数时相减结果前加一个负号即可。...具体进行相加时候两个字符数组对应数字字符相加即可,当有进位时候做出标记,更高一位进行相加时再将这个进位加进去。同样相减时候有借位也做出标记,更高一位相减时候将这个借位算进去。

1.8K20
领券