链表之反转链表
创始人
2024-03-03 22:32:07
0

文章目录

      • 链表之反转链表
        • 题目描述
        • 解题思路
        • 代码实现

链表之反转链表

力扣链接

题目描述

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

示例:

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

限制:

​ 0 <= 节点个数 <= 5000

解题思路

方法一:

遍历链表,并在访问各节点时修改 next 引用指向,使其指向前一个节点

复杂度分析:

时间复杂度 O(N) : 遍历链表使用线性大小时间
空间复杂度 O(1) : 变量 precur 使用常数大小额外空间

方法二:

使用递归法遍历链表,当越过尾节点后终止递归,尾节点就是反转后的头节点,在回溯时修改各节点的 next 引用指向

  • reverseList(head) 函数:

    • 调用并返回 recur(head, null) 。传入 null 是因为反转链表后, head 节点指向 null ;
  • recur(cur, pre) 递归函数

    • 终止条件:当 cur 为空,则返回尾节点 pre (即反转链表的头节点);
    • 递归后继节点,记录返回值(即反转链表的头节点)为 res ;
    • 修改当前节点 cur 引用指向前驱节点 pre ;
    • 返回反转链表的头节点 res ;

假如链表1->2->3->4->5->NULL
recur(head,NULL)->recur(2,1)->recur(3,2)->recur(4,3)->recur(5,4)->recur(NULL,5)


此时res为5->NULL,cur指向5,pre指向4,反转,使5指向4,再返回res【5->4->NULL】<-回溯<-此时返回节点5 后续步骤同理,最后res为5->4->3->2->1->NULL


复杂度分析:

时间复杂度 O(N) : 遍历链表使用线性大小时间。
空间复杂度 O(N) : 遍历链表的递归深度达到 N,系统使用 O(N)大小额外空间。

代码实现

#include using namespace std;struct ListNode{int val;ListNode* next;ListNode(int x) : val(x),next(NULL){} 
};class Solution{
public://方法一:迭代(双指针) ListNode* reverseList(ListNode* head) {if(head==NULL || head->next==NULL)return head;else{ListNode* pre = NULL;ListNode* cur = head;ListNode* tmp = NULL;//暂存后继节点cur->next while(cur!=NULL){		tmp = cur->next;	//保存下一个节点 cur->next= pre;		//让当前节点指向上一个节点 pre = cur;			//pre暂存cur cur = tmp;			//cur移动到下一个节点 }						//直到cur为空,此时cur从最后一个节点往后移到NULL,而pre移到了最后一个节点 return pre;}}//方法二 递归ListNode* reverseList2(ListNode* head){if(head==NULL||head->next == NULL){return head;} elsereturn recur(head,NULL);}ListNode* recur(ListNode* cur,ListNode* pre){if(cur == NULL) return pre;else{ListNode* res = recur(cur->next,cur);cur->next = pre;return res;}}//链表打印函数void ListPrint(ListNode* head){ListNode* p = head;while(p){cout<val<<"->";p = p->next;}cout<<"NULL"<next){tail = tail->next;}tail->next = newNode;}}
};int main(){ListNode* test = new ListNode(1);ListNode* re;class Solution s;s.ListPushBack(&test,2);s.ListPushBack(&test,3);s.ListPushBack(&test,4);s.ListPushBack(&test,5);
//	s.ListPushBack(&test,6);s.ListPrint(test);re = s.reverseList(test);s.ListPrint(re);return 0;
}

结果:

image-20221129113041637

参考题解:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/solutions/476929/jian-zhi-offer-24-fan-zhuan-lian-biao-die-dai-di-2/

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
AWSECS:哪种网络模式具有... 使用AWS ECS中的awsvpc网络模式来获得最佳性能。awsvpc网络模式允许ECS任务直接在V...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...