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

yizhihongxing

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日

相关文章

  • 小米9如何重启到恢复模式?小米9重启到恢复模式的方法介绍

    小米9重启到恢复模式的方法如下: 方法1:使用按键组合 首先,关机你的小米9手机。 接着,按住音量上键和电源键同时按下,直到手机进入恢复模式为止。 在恢复模式中,你可以通过音量键上下移动光标,通过电源键选中你要执行的操作。 选中需要执行的操作后,按下电源键即可执行。 方法2:使用ADB命令 连接你的小米9手机到电脑上,并打开CMD或终端。 在CMD或终端中,…

    other 2023年6月27日
    00
  • javalong转为int

    javalong转为int 在Java中,有时候需要将一个long类型的数据转换为int类型的数据,但是由于long类型的数据的范围比int类型的数据大,在转换时需要进行一些特殊的处理,否则可能会导致数据丢失或者精度问题。 方法一:强制类型转换 在Java中,可以使用强制类型转换将long类型的数据转换为int类型的数据,如下所示: long l = 123…

    其他 2023年3月28日
    00
  • win7下配置GO语言环境 + eclipse配置GO开发

    1. 配置GO语言环境 1.1 下载GO语言安装包 去https://golang.google.cn/dl/ ,根据自己的操作系统版本下载对应的安装包。 示例:下载Windows 64位的安装包。 1.2 安装GO语言 双击安装包,按照提示一步一步安装即可。安装完成后,检查系统环境变量中是否已经配置好了GOPATH。 示例:在安装过程中,按照默认设置来安装…

    other 2023年6月27日
    00
  • MySQL查询条件常见用法详解

    MySQL查询条件常见用法详解 1. 基本查询条件 MySQL中,查询条件用于限制数据的返回结果,常见的基本查询条件有以下几种: 1.1 等于条件(=) 使用等于条件可以精确匹配某个特定值,语法格式如下: SELECT * FROM 表名 WHERE 列名 = 值; 示例: 假设有一个名为users的表,其中有id、name和age三个字段。我们想要查询年龄…

    other 2023年6月28日
    00
  • nginx could not build the server_names_hash 解决方法

    当我们在使用nginx作为web服务器时,可能会出现类似“nginx could not build the server_names_hash”的错误提示。这个错误通常是由于nginx中定义的server name太多,超出了默认的hash bucket size所致。 要解决这个问题,我们需要改变nginx配置中的server_names_hash_ma…

    other 2023年6月27日
    00
  • SpringBoot配置文件中系统环境变量存在特殊字符的处理方式

    当Spring Boot配置文件中的系统环境变量(通常以${}形式表示)包含特殊字符时,需要进行处理。常见的两种特殊字符是冒号(:)和横线(-)。这些字符在Spring Boot配置文件中具有特殊含义,而在环境变量中也有可能出现。以下是处理这些特殊字符的几种方法: 方法1:使用反斜线转义特殊字符 可以在特殊字符前面加上反斜线(\)来转义它们。例如,如果配置文…

    other 2023年6月27日
    00
  • 三星s4内存不足怎么办?三星s4内存不足怎么清理?

    三星S4内存不足解决攻略 如果你的三星S4手机内存不足,无法正常运行或安装新应用程序,下面是一些解决方法和清理步骤,帮助你释放内存空间。 1. 删除不必要的应用程序和数据 首先,你可以删除一些不必要的应用程序和数据来释放内存空间。以下是具体步骤: 打开手机的设置菜单。 点击“应用程序”或“应用管理器”选项。 在应用程序列表中,浏览并选择你不再需要的应用程序。…

    other 2023年8月1日
    00
  • Java无限级树(递归)超实用案例

    Java无限级树(递归)超实用案例 简介 无限级树即为树形结构,每个节点都可以拥有多个子节点,并且每个子节点都可以继续拥有多个子节点,即“无限级”;递归则以特定的方式循环重复调用函数,以实现某种算法的目的。本案例通过将递归运用到无限级树上,实现了一个非常实用的树形结构数据处理方法。 实现思路 在Java中实现无限级树的情况下,我们可以通过创建一个树节点类,其…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部