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日

相关文章

  • 在win7下安装CAD时系统提示1606错误的可行解决方案

    下面是对于win7下安装CAD时系统提示1606错误的可行解决方案的完整攻略。本文将分为以下几个步骤: 了解1606错误 解决方案一:修改注册表 解决方案二:创建虚拟目录 了解1606错误 1606错误是指找不到网络位置的错误。通常在安装软件时,会出现这个错误。原因是安装程序找不到所需文件的位置,也就是说安装程序认为文件存放在某个位置,但实际上不存在。 解决…

    other 2023年6月26日
    00
  • Android中的Parcelable序列化对象

    下面是详细讲解“Android中的Parcelable序列化对象”的完整攻略: 什么是Parcelable Parcelable是一个序列化对象的接口,在Android中,如果我们想让一个Java对象能够在不同的组件或者进程间传递,那么这个Java对象必须去实现Parcelable接口从而达到序列化的目的。与Serializable相比,Parcelable…

    other 2023年6月27日
    00
  • 关于html:bootstrap:本地安装的bootstrap.min.js不起作用

    关于html:bootstrap:本地安装的bootstrap.min.js不起作用 Bootstrap是一种流行的前端框架,它可以帮助我们快速构建响应式网站。在使用Bootstrap,我们通常需要将引入我们的HTML文件中。本攻略将详细讲解如何在本安装Bootstrap,并解决本地安装的bootstrap.min.js不起用的问题。 步骤1:下载Boots…

    other 2023年5月9日
    00
  • Win10周年更新教育版中文官方ISO镜像下载地址(32位/64位)

    Win10周年更新教育版中文官方ISO镜像下载攻略 Win10周年更新教育版是一款面向教育领域的操作系统版本,提供了一系列专为学生和教育工作者设计的功能和工具。以下是获取Win10周年更新教育版中文官方ISO镜像的详细攻略。 步骤一:访问官方网站 首先,打开你的网络浏览器,访问微软官方网站。你可以在浏览器的地址栏中输入以下网址: https://www.mi…

    other 2023年7月28日
    00
  • mysql 存储过程中变量的定义与赋值操作

    当在MySQL存储过程中定义和使用变量时,可以按照以下步骤进行操作: 定义变量:在存储过程的开头或需要使用变量的地方,使用DECLARE语句来定义变量。语法如下: sql DECLARE variable_name datatype [DEFAULT initial_value]; 其中,variable_name是变量的名称,datatype是变量的数据类…

    other 2023年8月9日
    00
  • C语言单链表遍历与求和示例解读

    C语言单链表遍历与求和示例解读是一个重要的程序开发技能,它能帮助程序员更好地理解链表的操作方法,并能有效完成链表求和等需求。下面,我们将从以下几个方面进行详细讲解。 1. 单链表的创建与初始化 在正式开始单链表遍历与求和的过程前,需要先创建并初始化单链表。一般而言,单链表的初始化主要包括链表的头节点初始化以及节点的申请和赋值。下面是单链表的创建示例代码: s…

    other 2023年6月27日
    00
  • Python中通过@classmethod 实现多态的示例

    对于 Python 中如何通过 @classmethod 实现多态的问题,下文将给出详细的攻略。 什么是多态? 多态是一种面向对象编程的重要概念,表示同一操作在不同的对象上可以有不同的实现方式。简单来说,多态就是不同的类对同一个方法可以有不同的实现。 Python 中的 @classmethod 在 Python 中,通过使用 @classmethod 装饰…

    other 2023年6月26日
    00
  • C语言编译器使用教程

    C语言编译器使用教程 欢迎来到C语言编译器使用教程。 C是一种广泛使用的编程语言,几乎可以用于任何应用场景。而在C语言开发过程中,编译器是最基本的工具之一。本教程将带你逐步学习如何使用C语言编译器。 第一步:安装C语言编译器 在使用C语言编译器之前,我们需要先在本地安装它。根据你所使用的操作系统,你可以在下列链接中寻找对应的编译器: GCC Clang Vi…

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