C++实现LeetCode(206.倒置链表)

yizhihongxing

首先,LeetCode的题目206是一个非常经典的链表反转问题。可以使用迭代和递归两种方式来实现。

1. 题目描述

反转一个单链表。

示例 1:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

示例 2:

输入: NULL

输出: NULL

2. 迭代实现

可以通过迭代方式,依次将当前节点的next指向前面的节点,直到所有节点都被反转。详细代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {

        ListNode* prev = nullptr, *curr = head;

        while (curr != nullptr) {
            ListNode* nextNode = curr->next;
            curr->next = prev;
            prev = curr;
            curr = nextNode;
        }

        return prev;
    }
};

3. 递归实现

可以通过递归方式,依次反转每个节点,并将当前节点的next节点指向前面的节点。详细代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {

        if (head == nullptr || head->next == nullptr) {
            return head;
        }

        ListNode* p = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;

        return p;
    }
};

4. 示例说明

示例 1:

输入:1->2->3->4->5->NULL

输出:5->4->3->2->1->NULL

通过迭代的方式实现:

初始化:prev = nullptr, curr = 1->2->3->4->5->NULL
第一次循环:curr = 2->3->4->5->NULL, prev = 1->NULL
第二次循环:curr = 3->4->5->NULL, prev = 2->1->NULL
第三次循环:curr = 4->5->NULL, prev = 3->2->1->NULL
第四次循环:curr = 5->NULL, prev = 4->3->2->1->NULL
第五次循环:curr = NULL, prev = 5->4->3->2->1->NULL
返回结果:prev = 5->4->3->2->1->NULL

通过递归的方式实现:

reverseList(1->2->3->4->5->NULL) -> reverseList(2->3->4->5->NULL) -> reverseList(3->4->5->NULL) -> reverseList(4->5->NULL) -> reverseList(5->NULL) 

函数返回 5->4->3->2->1->NULL,整个过程都是通过递归调用数据达到反转的目的。

5. 总结

C++实现LeetCode(206.倒置链表)问题的关键在于理解链表反转的本质和特点,能够使用迭代或递归的方式实现。同时,本题也是链表反转的模板题目,对于类似的问题,同样可以套用反转链表的思想进行解题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(206.倒置链表) - Python技术站

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

相关文章

  • iOS13.3正式版固件下载地址 iOS13.3正式版支持机型及固件下载

    iOS13.3正式版固件下载地址 iOS 13.3正式版是苹果公司发布的最新操作系统版本之一。在本攻略中,我将为您提供iOS 13.3正式版固件的下载地址,并列出支持该版本的机型。请按照以下步骤进行操作: 步骤一:访问官方网站 首先,您需要访问苹果公司的官方网站以获取iOS 13.3正式版固件的下载地址。您可以在以下网址找到官方下载页面:https://ww…

    other 2023年8月4日
    00
  • C语言双指针多方法旋转数组解题LeetCode

    关于“C语言双指针多方法旋转数组解题LeetCode”的攻略如下: 问题描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 解题思路 考虑使用双指针的方法进行旋转。首先,指定一个指针 $L$ 指向数组的最左侧,再指定一个指针 $R$ 指向从最右端起第 $k$ 个位置。接着,利用双指针交换数组元素,即将 $L$ 指向的元素和 $R$ …

    other 2023年6月25日
    00
  • 怎么设置Win11右键默认显示更多选项?

    下面是设置Win11右键默认显示更多选项的完整攻略。 1. 打开本地组策略编辑器 首先需要打开本地组策略编辑器,可以通过以下步骤打开: 按下 Win + R 组合键打开“运行”对话框 输入“gpedit.msc”并按下回车键,打开本地组策略编辑器 2. 找到右键菜单相关的组策略 在本地组策略编辑器中,可以找到与右键菜单相关的组策略。具体步骤如下: 在本地组策…

    other 2023年6月27日
    00
  • 在Linux中使用命令行计算器GNU bc的方法

    当需要在Linux终端中进行计算时,可以通过命令行计算器GNU bc来快速进行数学运算。下面是使用命令行计算器GNU bc的方法: 安装GNU bc 在大多数Linux发行版中,GNU bc可能已经预装了,可以使用以下命令进行检查: bc –version 如果GNU bc没有安装,则可以使用以下命令进行安装: 在Debian/Ubuntu中: sudo …

    other 2023年6月26日
    00
  • unity中的webview

    当然,我很乐意为您提供有关“Unity中的WebView”的完整攻略。以下是详细的步骤和两个示例: 1 WebView的介绍 WebView是Unity中的一个组件,它可以在游戏中嵌入Web页面。使用WebView,您可以在游戏中显示网页内容,例如广告、社交媒体、新闻、游戏内商店等。 2 WebView的使用 以下是使用WebView的步骤: 2.1 导入W…

    other 2023年5月6日
    00
  • 使用hbuilder开发移动app

    以下是使用HBuilder开发移动App的完整攻略,包含两个示例说明: 步骤1:安装HBuilder 首先,您需要下载并安装HBuilder。您可以官方网站(https://www.dcloud.io/hbuilderx.html)下载HBuilder。 步骤2:创建新项目 在HBuilder中创建一个新项目您可以使用以下步骤创建新项目: 打开HBuilde…

    other 2023年5月6日
    00
  • Flutter 中如何优雅的实现多渠道打包(埋点统计系列)

    Flutter 中如何优雅的实现多渠道打包(埋点统计系列) 本文将为您详细讲解如何在Flutter中优雅地实现多渠道打包,包括环境搭建、配置文件修改、打包命令和示例说明等步骤。 环境搭建 在开始实现多渠道打包之前,需要先在Flutter项目中添加flutter_channel插件。可以按照以下步骤进行操作: 在pubspec.yaml文件中添加flutter…

    other 2023年5月6日
    00
  • C语言超详细讲解轮转数组

    C语言轮转数组的完整攻略 背景 轮转数组(也叫环形数组)是一种将数组元素循环移动的处理方式。它通常用于解决一些需要对固定长度的数组进行循环滚动处理的问题,例如字符串移位、碰撞检测等。 本文将介绍C语言中轮转数组的使用方法,包括定义、初始化、遍历、插入、删除、倒置等操作。 定义与初始化 定义一个轮转数组需要指定它的长度和元素类型,例如定义一个长度为10的整数轮…

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