C++实现反转链表的两种方法

C++实现反转链表的两种方法

在C++中,反转链表有两种常见的实现方法,分别是迭代法和递归法。

迭代法

迭代法解决链表反转问题的步骤如下:

  1. 创建三个指针:pre、current和next。
  2. 将当前节点的后继指针指向前一个节点,即current->next = pre
  3. 将pre、current、next三个指针依次向左移动一个节点。
  4. 重复2、3步,直到遍历完整个链表。

迭代法的具体实现代码如下:

ListNode* reverseList(ListNode* head) {
    ListNode* pre = nullptr;
    ListNode* current = head;
    ListNode* next = nullptr;
    while (current) {
        next = current->next;
        current->next = pre;
        pre = current;
        current = next;
    }
    return pre;
}

递归法

递归法解决链表反转问题的步骤如下:

  1. 定义递归函数reverse(head),输入一个节点head,返回反转后的链表头。
  2. 当head为空节点或者head的后继节点为空节点时,直接返回head。
  3. 调用递归函数,传入head的后继节点,返回反转后的链表头。
  4. 将head节点的后继指针指向head节点的前一个节点。
  5. 返回反转后的链表头。

递归法的具体实现代码如下:

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

示例说明

以链表1->2->3->4->5为例,通过迭代法和递归法反转链表之后的结果如下:

  1. 迭代法:5->4->3->2->1
ListNode* reverseList(ListNode* head) {
    ListNode* pre = nullptr;
    ListNode* current = head;
    ListNode* next = nullptr;
    while (current) {
        next = current->next;
        current->next = pre;
        pre = current;
        current = next;
    }
    return pre;
}
  1. 递归法:5->4->3->2->1
ListNode* reverseList(ListNode* head) {
    if (!head || !head->next) {
        return head;
    }
    ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

通过以上两种方法,都可以实现链表的反转,具体选择哪种方法,可以根据需求灵活选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现反转链表的两种方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 基于JavaScript实现智能右键菜单

    下面是基于JavaScript实现智能右键菜单的完整攻略。 1. 背景介绍 智能右键菜单是指当用户在浏览器中使用右键单击时,会弹出根据不同情况自动生成的菜单。这种菜单能够自动识别网页中的选中文本、链接、图片等内容,并提供相应的操作选项。实现这样的功能可以大大提高用户的使用体验。本教程将介绍如何通过JavaScript来实现智能右键菜单。 2. 实现步骤 2.…

    other 2023年6月27日
    00
  • CentOS下SWAP分区建立及释放内存详解

    CentOS下SWAP分区建立及释放内存详解 在CentOS系统中,SWAP分区可以用来扩展系统的虚拟内存,以提供更多的可用内存空间。本攻略将详细介绍如何在CentOS下建立和释放SWAP分区。 建立SWAP分区 确认系统是否已经存在SWAP分区。可以通过运行以下命令来检查: swapon –show 如果没有任何输出,则表示系统当前没有SWAP分区。 创…

    other 2023年8月1日
    00
  • readystatechange事件

    readyStateChange事件 什么是readyStateChange事件? 在使用 Ajax 技术进行网络通信时,我们经常需要使用XMLHttpRequest对象。在这个对象中,readyState表示 XMLHttpRequest 对象的状态。而readystatechange事件则是在这个状态发生变化时被触发。 具体来说,当readyState属…

    其他 2023年3月29日
    00
  • Android获取其他包的Context实例代码

    Android获取其他包的Context实例代码 在Android开发中,有时候我们需要获取其他应用程序的Context实例,以便进行跨应用的操作。下面是获取其他包的Context实例的代码示例: 示例一:通过包名获取Context实例 String packageName = \"com.example.otherapp\"; Cont…

    other 2023年10月13日
    00
  • win10计算器命令怎么打开?win10计算器命令打开方法

    在Windows 10中,可以使用命令行方式打开计算器,下面是打开计算器的几种不同的方式: 使用Win+R命令打开计算器 Win+R是Windows操作系统中打开运行窗口的快捷键组合,可以在其中输入命令来运行程序。在运行窗口中输入”calc”即可打开计算器。 具体步骤如下: 按下Win+R组合键,打开运行窗口; 在运行窗口中输入”calc”; 按下回车键,打…

    other 2023年6月26日
    00
  • mysql 中如何取得汉字字段的各汉字首字母

    在 MySQL 中,可以使用 SUBSTRING() 函数、ASCII() 函数和REPLACE()函数来实现取得汉字字段的各汉字首字母。以下是具体的步骤: 步骤1:使用 SELECT 语句选择要获取首字母的汉字字段,例如表名为 table1,汉字字段名为 name,可以执行如下语句: SELECT name FROM table1; 步骤2:将汉字字段转换…

    other 2023年6月25日
    00
  • Spring注解驱动之关于@Bean注解指定初始化和销毁的方法

    关于@Bean注解,它可以被用在一个方法上,用来告知Spring框架,它所要创建并返回的对象需要被注册为一个bean。此外,@Bean注解可以通过initMethod和destroyMethod属性来告知Spring,在创建和销毁该bean时,需要执行哪些方法。 一、@Bean注解 1.1 定义Bean 在使用@Bean注解时,我们将其用于一个方法上,这个方…

    other 2023年6月20日
    00
  • wire.h’对应多个库

    wire.h对应多个库 Arduino的wire库是一个用于I2C协议的库,它提供了读写I2C设备所需的函数。相信很多Arduino爱好者在使用过程中会经常遇到因为不同版本的wire库而出现的一些问题。在这篇文章中,我们将深入研究wire.h对应的多个库以及它们之间的区别和联系。 Arduino Wire库 Arduino Wire库是Arduino自带的I…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部