【数据结构】--单链表力扣面试题②反转链表

这篇具有很好参考价值的文章主要介绍了【数据结构】--单链表力扣面试题②反转链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目链接:反转链表 

 法一:直接反转法

法二:头插法


题目链接:反转链表 

【数据结构】--单链表力扣面试题②反转链表

题目分析:

创建一个新链表,然后值是逆置的行吗?不行。因为题目要求的是在原链表上逆置,改变原链表的指向,并不是值的拷贝后的逆转那其实总共有三种方法法一,直接原地翻转。法二,头插法。法三,递归法。这里讲解法一法二。因为能用循环就用循环,没必要用递归,因为递归有缺陷,如果链表够长的话,肯定会造成栈溢出,栈的空间本来就不大。


 法一:直接反转法

解题思路:

定义两个变量指针指向节点

【数据结构】--单链表力扣面试题②反转链表

 如图,我们可以让n2的next指针域指向n1,然后让n2指向现节点的下一节点,但是怎么找下一节点?遇到这种情况我们就可以再创建一个指针n3,这样就能找到下一节点了,因为这个过程需要遍历链表,所以需要n3

n1和n2是用来翻转链表的,n3是用来迭代

【数据结构】--单链表力扣面试题②反转链表

 迭代到最后

【数据结构】--单链表力扣面试题②反转链表

终止条件:n2==NULL而不是第一次n3==NULL,因为若此时终止,n2的节点的指针域还未指向n1,最终可知新头结点是n1

C++版本代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == nullptr) return nullptr;

        ListNode* n1 = nullptr, *n2 = head, *n3 = head->next;
        while (n2)
        {
            n2->next = n1;
            n1 = n2;
            n2 = n3;
            if (n3) n3 = n3->next;
        }
        return n1;
    }
};

 C版本代码:

struct ListNode* reverseList(struct ListNode* head)
{
	if (!head)//如果为空 !NULL为真,则返回NULL
	{
		return NULL;
		//如果为空链表,则无需翻转,直接返回NULL,
		//如果此刻你不返回,那么会对NULL指针解引用,会非法访问内存
	}

	struct ListNode* n1, * n2, * n3;
	n1 = NULL;
	n2 = head;
	n3 = head->next;

	while (n2)//通过画图可知,n2为空时就是翻转完毕的时候
	{
		n2->next = n1;//翻转链表

		n1 = n2;//迭代
		n2 = n3;//迭代
		if (n3)//如果n3已经为NULL了,就没有必要走这个循环了
			n3 = n3->next;
	}

	return n1;
}

法二:头插法

解题思路:取原链表中的节点,头插到新链表newhead中。

【数据结构】--单链表力扣面试题②反转链表

C++版本代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head, *next = nullptr, *newhead = nullptr;
        while (cur)
        {
            next = cur->next;
            //头插
            cur->next = newhead;
            newhead = cur;
            cur = next;
        }
        return newhead;
    }
};

C版本代码:文章来源地址https://www.toymoban.com/news/detail-457540.html

struct ListNode* reverseList(struct ListNode* head)
{//这种情况不用格外考虑是不是空链表的问题,因为如果是,循环都进不去,直接返回NULL
	struct ListNode* cur = head;
	struct ListNode* next = NULL;
	struct ListNode* newhead = NULL;
	while (cur)
	{
		next = cur->next;
		//头插
		cur->next = newhead;
		newhead = cur;
		//迭代往后走
		cur = next;
	}
	return newhead;
}

到了这里,关于【数据结构】--单链表力扣面试题②反转链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】数据结构小试牛刀之单链表

    不讲虚的啦,直接肝! 单链表所要实现的功能罗列如下: 初始化工作我们先初始化一个节点类型,类型中包括了数据域和指针域,数据与中保存着该节点要保存的数据,指针域则保存着链表下一个节点的地址: 然后我们在创建一个函数,用于创建一个新的节点,因为后面我

    2023年04月24日
    浏览(59)
  • 【数据结构-链表-01】反转链表

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月10日
    浏览(43)
  • 【数据结构和算法】反转链表

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

    2024年01月18日
    浏览(50)
  • 数据结构 - 单链表

    目录 文章目录 一、什么是链表? 线性表: 顺序表: 二、链表的分类和实现 分类: 实现: 1.创建节点类 2.创建单链表  1.addTail(尾增)   2.删除节点值为key的第一个节点  3.插入节点(在指定位置) 4.获取链表长度  总结 前言 大家好,这篇博客给大家讲一下什么是链表以及单链表的实现

    2024年02月09日
    浏览(40)
  • 数据结构单链表

    单链表 1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前,我们是写了顺序表,顺序表就是类似一个数组的东西,它的存放是连续的,优点有很多,比如支持

    2024年02月12日
    浏览(41)
  • 【数据结构】单链表(详解)

    所属专栏:初始数据结构 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 前面我们已经用顺序表方式来实现接口

    2023年04月24日
    浏览(51)
  • 数据结构-单链表

    概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。  从以上图片可以看出: 1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。 2.现实中的节点一般是在堆上申请出来的。 3.从堆上申请的空间,

    2024年02月05日
    浏览(38)
  • 数据结构:单链表

    单链表的全称为\\\"不带头单向不循环链表\\\" 注意:         下文提到的头节点与带头链表时两个概念,文中的头节点指的是第一个有效节点,二带头节点中的头指的是第一个无效节点 链表和顺序表一样,都是线性表,逻辑结构上是线性的,但不同的是,链表在物理结构上不是线性的

    2024年01月21日
    浏览(38)
  • 【数据结构】单链表详解

    当我们学完顺序表的时候,我们发现了好多问题如下: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们 再继续插入了

    2024年02月09日
    浏览(33)
  • 【数据结构】单链表(超全)

    前言:  上一次我们分享了线性表中的一种结构顺序表,它存在着一些其缺点,比如:在中间位置或者头部进行元素插入或者删除的时候时间复杂度是 O ( N ) O(N) O ( N ) 效率比较低,并且顺序表在扩容的时候也存在时间和空间上的消耗,由于我们每次都是按照二倍来扩的,那

    2024年02月11日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包