算法村第二关(1)——手写链表反转

这篇具有很好参考价值的文章主要介绍了算法村第二关(1)——手写链表反转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手写链表反转

题目:Leetcode-206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表
算法村第二关(1)——手写链表反转,算法,链表,数据结构

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

对于链表反转的问题,想起来其实非常简单。
就是从前往后,将节点一个一个采用头插法的做成一个新链表嘛,这样新链表就是旧链表的反转链表啦!

那既然这么简单,为什么还要学习链表反转呢?
因为,这个思想非常地常用,比如指定区间反转,链表k个一组反转等等

 struct ListNode {
     int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
};

那用代码怎么实现反转呢?

先说两种好理解的思路,
一种我们借用一个空的头节点,
另一种我们直接用头指针实现。在很多链表算法题中,借用空头节点可以非常好地简化指针的操作逻辑。

借用空头节点

算法村第二关(1)——手写链表反转,算法,链表,数据结构

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    	ListNode* headNode = new ListNode();
    	
    	ListNode* curNode = head; // 当前插入节点
    	while(curNode != nullptr) {
            auto nextNode = curNode->next; // 记录下一个节点
            // 将当前节点插入到新节点头部
            curNode->next = headNode->next;
            headNode->next = curNode;
            curNode = nextNode;
        }
        
        return headNode->next;
    }
};

纯头指针

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    	ListNode* curNode = head;
        head = nullptr;
        while(curNode != nullptr) {
            auto nextNode = curNode->next;
            curNode->next = head;
            head = curNode;
            curNode = nextNode;
        }
        
        return head;
    }
};

递归实现

第三种不太好理解的方法,我们采用递归的方法来实现。2

怎么样递归呢?化整为零,先递到最后的一个节点,然后依次返回后面节点反转后的结果。

借助示意图进行理解:
算法村第二关(1)——手写链表反转,算法,链表,数据结构文章来源地址https://www.toymoban.com/news/detail-632322.html

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 退出递归的条件
        if(head == nullptr || head->next == nullptr) {
            return head;
        }
        
        ListNode* newHead = reverseList(head->next);
        
        head->next->next = head;
        head->next = nullptr;
        
        return newHead;
    }
};

到了这里,关于算法村第二关(1)——手写链表反转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Go版]算法通关村第二关——终于学会链表反转了

    题目链接:LeetCode-206. 反转链表 源码地址:GitHub-golang版本 说明:遍历该链表,依次取出当前节点插入到新链表的首位(虚拟头结点紧后)即可, 注意要提前保存当前节点的Next数据 ,否则插入到新链表后就没法继续向下遍历了。 说明:原理和方法1一致,只不过现在没有虚拟

    2024年02月14日
    浏览(44)
  • [Go版]算法通关村第二关青铜——终于学会链表反转了

    题目链接:LeetCode-206. 反转链表 源码地址:GitHub-golang版本 说明:遍历该链表,依次取出当前节点插入到新链表的首位(虚拟头结点紧后)即可, 注意要提前保存当前节点的Next数据 ,否则插入到新链表后就没法继续向下遍历了。 说明:原理和方法1一致,只不过现在没有虚拟

    2024年02月13日
    浏览(35)
  • 算法通关村第二关——指定区间反转问题解析

    Leetcode92有这样一道题:给你单链表的头指针head和两个整数left、right,其中left=right,请你反转从位置left到位置right的链表结点,返回反转后的链表,如图所示: 这道题呢,有两种不同的解法,分别是头插法和穿针引线法,头插法就是我们前面说过的带头结点的反转,而穿针引

    2024年02月14日
    浏览(44)
  • 算法通关村第二关——K个一组反转

    前面有很多关于链表反转的知识,K个一组反转,就是让很多组节点进行翻转,本质也都是一样的。 现在的链表是 3-2-1-4-5-6-7-8 3-2-1已经进行了反转,现在要进行反转的是4-5-6 在这里首先计算出链表的长度,然后计算出要反转几组,现在定义pre为dummyNode,cur定义为head。 通过f

    2024年02月14日
    浏览(45)
  • 算法通关村第二关——终于学会链表

    LeetCode206 给我们单链表的头结点head,请你反转链表,并返回反转后的链表,如图所示: 本题有两种方法,分别为 建立虚拟头结点辅助反转 以及 直接操作链表实现反转 ,两种方法我将逐一分析讲解。 首先从名字分析一下这种方法,虚拟头结点,顾名思义,我们可以建立一个

    2024年02月15日
    浏览(43)
  • 不简单的字符串转换问题(算法村第十二关青铜挑战)

    709. 转换成小写字母 - 力扣(LeetCode) 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 1 = s.length = 100 解 大写字母和小写字母的值之间存在固定的差异。例如,小写字母 a 的ASCII值为 97 ,而对应的大写字母 A 的ASCII值为 65 ,两者之差恰

    2024年01月25日
    浏览(48)
  • 【数据结构和算法】反转链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.1 方法一:迭代(双指针) 3.2 方法二:递归 四、复杂度分析 4.1 方法一:迭代

    2024年01月18日
    浏览(53)
  • 【数据结构与算法分析】反转链表与顺序表(内含源码,思路清晰)

      顺序表和链表都是数据结构中常见的线性表。它们的主要区别在于 内存管理方式不同 。   顺序表(Array)是由一系列元素按照一定顺序依次排列而成,它使用连续的内存空间存储数据。顺序表使用一个数组来存储数据,数组中的每个元素都可以通过下标来访问。顺序

    2024年02月07日
    浏览(105)
  • 算法通关村第十二关——字符串反转问题解析

    字符串反转是关于字符串算法里的重要问题,虽然不是太难,但需要考虑到一些边界问题。本篇文章就对几道字符串反转题目进行分析。 力扣344题,编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包