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

 更新时间:2021年08月06日 16:30:04   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(206.倒置链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 206.Reverse Linked List 倒置链表

Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

Follow up:

A linked list can be reversed either iteratively or recursively. Could you implement both?

 之前做到 Reverse Linked List II 的时候我还纳闷怎么只有二没有一呢,原来真是忘了啊,现在才加上,这道题跟之前那道比起来简单不少,题目为了增加些许难度,让我们分别用迭代和递归来实现,但难度还是不大。我们先来看迭代的解法,思路是在原链表之前建立一个空的newHead,因为首节点会变,然后从head开始,将之后的一个节点移到newHead之后,重复此操作直到head成为末节点为止,代码如下:

解法一:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *newHead = NULL;
        while (head) {
            ListNode *t = head->next;
            head->next = newHead;
            newHead = head;
            head = t;
        }
        return newHead;
    }
};

下面我们来看递归解法,代码量更少,递归解法的思路是,不断的进入递归函数,直到head指向倒数第二个节点,因为head指向空或者是最后一个结点都直接返回了,newHead则指向对head的下一个结点调用递归函数返回的头结点,此时newHead指向最后一个结点,然后head的下一个结点的next指向head本身,这个相当于把head结点移动到末尾的操作,因为是回溯的操作,所以head的下一个结点总是在上一轮被移动到末尾了,但head之后的next还没有断开,所以可以顺势将head移动到末尾,再把next断开,最后返回newHead即可,代码如下:

解法二:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *newHead = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return newHead;
    }
};

到此这篇关于C++实现LeetCode(206.倒置链表)的文章就介绍到这了,更多相关C++实现倒置链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言内存操作函数使用示例梳理讲解

    C语言内存操作函数使用示例梳理讲解

    这篇文章主要介绍了C语言库函数中的内存操作函数memcpy()、memmove()、memset()、memcmp()使用示例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 浅谈C++为什么非要引入那几种类型转换

    浅谈C++为什么非要引入那几种类型转换

    这篇文章主要介绍了C++为什么非要引入那几种类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 浅谈c++如何实现并发中的Barrier

    浅谈c++如何实现并发中的Barrier

    这篇文章主要介绍了浅谈c++如何实现并发中的Barrier,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C语言超全面define预处理指令的使用说明

    C语言超全面define预处理指令的使用说明

    C语言里可以用#define定义一个标识符来表示一个常量。特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了,也不做类型定义。预编译又叫预处理
    2022-04-04
  • C++中引用&与取地址&的区别分析

    C++中引用&与取地址&的区别分析

    这篇文章主要介绍了C++中引用&与取地址&的区别,有助于C++初学者更好的掌握指针的概念及用法,需要的朋友可以参考下
    2014-09-09
  • C++中数组作为函数参数传入的几种方式代码示例

    C++中数组作为函数参数传入的几种方式代码示例

    数组元素和数组名都可以作为函数的参数以实现函数间数据的传递和共享,下面这篇文章主要给大家介绍了关于C++中数组作为函数参数传入的几种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • C++详解PIMPL指向实现的指针

    C++详解PIMPL指向实现的指针

    PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问
    2022-07-07
  • C语言测试n的阶乘和x的n次方

    C语言测试n的阶乘和x的n次方

    今天小编就为大家分享一篇关于C语言测试n的阶乘和x的n次方,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言超细致讲解分支语句

    C语言超细致讲解分支语句

    分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句
    2022-05-05
  • 浅谈const变量赋值报错分析

    浅谈const变量赋值报错分析

    在类中 只有静态变量能赋值 如果你不赋值 编译器会认为你这个变量根本没用 不能被修改 又没有初始值 两个办法 在构造函数的初始化列表赋值 或者在const前面加一个static
    2015-07-07

最新评论