首页 > 其他分享 >剑指 Offer 24. 反转链表

剑指 Offer 24. 反转链表

时间:2023-05-26 19:00:42浏览次数:52  
标签:24 tmp ListNode cur Offer next 链表 prev 节点

剑指 Offer 24. 反转链表

</br></br>

题目:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

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

限制:

0 <= 节点个数 <= 5000

</br></br>

思路一:

双指针法:可以通过改变链表中节点的next指针的指向从而实现链表的反转。

1.设置两个节点prevcurcur表示当前节点,prev表示当前节点的上一个节点,初始状态设置为prev = nullptr; cur = head;再设置一个结点tmp记录cur的下一个结点,即tmp = cur->next

2.改变cur结点next指针的指向,让其指向前一个结点prev,然后再通过prev = cur; cur = tmp; tmp = cur->next更新cur节点、prev节点和tmp节点;

3.依次向后循环,当cur为空的时候,说明已经遍历完所有的节点,此时prev指向的节点就是反转后链表的头节点,返回的时候返回prev

代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head; 
        ListNode* prev = nullptr;
        while(cur)
        {
            ListNode* tmp = cur->next; //保存cur的下一个结点
            cur->next = prev;
            prev = cur;
            cur = tmp; 
        }
        return prev;
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

</br></br>

思路二:

递归:递归法和双指针法的逻辑相同,也是通过改变指针的指向从而实现反转。

1.递归函数中当cur不为空的时候,先记录下cur节点的下一个节点,再改变cur节点的next指针使其指向prev

2.发生递归,递归参数中的curtmp传到下一层函数后,cur充当prevtmp充当cur

3.当cur为空时递归结束,返回prev结点,此时的prev结点就是反转后的头结点;

双指针法中的循环以及pre = cur; cur = temp;通过递归实现了。

代码如下:

class Solution {
public:
    ListNode* Reverse(ListNode* prev,ListNode* cur)
    {
        if(cur == nullptr)
        {
            //当cur为空的时候,已经遍历完成,此时prev就是反转后链表的头节点 
            return prev;
        }
        ListNode* tmp = cur->next;
        cur->next = prev;//改变cur的next指针指向
        return Reverse(cur,tmp);
    }
    ListNode* reverseList(ListNode* head) {
        return Reverse(nullptr,head);
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

标签:24,tmp,ListNode,cur,Offer,next,链表,prev,节点
From: https://blog.51cto.com/u_15562309/6358374

相关文章

  • 5月24日总结
    MAUIAndroid关联文件类型实现效果打开某个文件,后缀是自己想要的类型,在弹出的窗口(用其它应用打开)的列表中显示自己的应用图标点击后可以获得文件信息以便于后续的操作用其它应用打开实现步骤以注册.bin后缀为例,新建一个MAUI项目调整启动模式修改Platforms\Android\M......
  • IPQ8072 or IPQ8072A with the QCN9074/9024 chipset / well-suited for high-end rou
    TheIPQ8072andIPQ8072AarebothpowerfulnetworkingSoCs(System-on-Chip)designedbyQualcommforhigh-performancerouters,enterpriseWi-Fiaccesspoints,andothernetworkingequipment.ThesechipsarepartofQualcomm'sNetworkingProseriesan......
  • (双指针)剑指 Offer 57. 和为s的两个数字
    题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。   classSolution{publicint[]twoSum(intnums[],inttarget){inti=0,j=nums.length-1;while(i<j){......
  • HDU 1024 Max Sum Plus Plus(动态规划)
    传送门题意是给你个数字序列,现在让你把这个序列分成m个连续的子序列,且要求这m个子序列的累加和最大。思路:这道题的题意可以理解为问在序列为末尾时,把序列分为m个子序列这个状态时的最大累加和,那么可以得出这个状态应该是由上一个状态转移得来:(因为dp[i][j]表示数到第j个字符时,前j个......
  • Jmeter函数助手24-longSum
    longSum函数可用于计算两个或多个长值的和。intSum函数参数值的范围在-2147483648到2147483647之间,而longSum函数的参数值范围比intSum的大。Firstlongtoadd:必填,填入整数,不能为小数Secondlongtoadd:必填,填入整数,不能为小数存储结果的变量名(可选) 1、longSum函数传入......
  • BGP线路有什么优势?43.248.187.x
       1、消除南北访问障碍由于BGP可以将联通、电信、移动等运营商的线路“合并”,使得中国南北无障碍通讯成为可能,对接入层来说,可使“联通、电信”这类区别消失,更能使一个网站资源无限制的在全国范围内无障碍访问,而不需要在异地部署VPN或者异地加速站来实现异地无障碍访问2、高......
  • Exp8 Web综合-20201324
    目录1基础问题回答1.1什么是表单1.2浏览器可以解析运行什么语言1.3WebServer支持哪些动态语言1.4防范注入攻击的方法有哪些2实验过程2.1Web前端HTML2.2Web前端javascipt2.3Web后端MySQL基础2.3.1建库2.3.2建表2.3.3修改密码2.3.4创建用户2.4Web后端PHP2.5最简单的S......
  • P2480 古代猪文 题解
    题意:求\[g^{\sum_{k\midn}{n\choosek}}\]对\(999911659\)取模。\(1\len,g\le10^9\)。思路:首先根据欧拉定理,题目转化为求\(\displaystyle\sum_{k\midn}{n\choosek}\)对\(999911658\)取模的值。模数为合数不是很好做,因式分解发现\(999911658=2\times3\times467......
  • error CS0246: The type or namespace name ‘NetworkManager‘ could not be found
    项目场景:之前用Unity5.x开发的项目,要升级到Unity2019问题描述:因为项目中用到了老版的Network导致升级后报错errorCS0246:Thetypeornamespacename'NetworkManager'couldnotbefound(areyoumissingausingdirectiveoranassemblyreference?)<hrstyle="border:s......
  • 【蓝桥杯入门不入土】变幻莫测的链表
    @[toc]一:链表的类型单链表什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。如图所示:双链表单链表中的指针域只......