反转链表的几种解法 — C++实现
发布日期:2021-10-02 06:27:40
浏览次数:3
分类:技术文章
本文共 1186 字,大约阅读时间需要 3 分钟。
题目描述
输入一个链表,反转链表后,输出新链表的表头。
解题思路1
使用额外空间,然后采用头插法将遍历到的结点插入到新建立链表的头部,将原链表的尾结点作为新链表的头结点即可,这种方法消耗的存储空间较大,新建了一个和原来链表一样大小的链表,不推荐。
代码实现
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *p,*head; if(!pHead)return NULL; p=pHead; ListNode *ptr; head=NULL; while(p){ ptr=new ListNode(p->val); ptr->next=head,head=ptr,p=p->next; } p=head; return head; }};
运行时间:2ms占用内存:500k
解题思路2
其实我们只需要将原链表结点的next
指向原链表的上一结点,没有就为NULL
,为此,我们需要3
个指针:
- 一个用来存储当前结点的下一结点(如果没有下一结点,当前结点则作为所求的头结点)
- 一个用来存储链表的上一结点
- 一个用来存储链表的当前结点,并将当前结的
next
指向链表的上一结点
需要注意的是,在修改当前结点的next
时,应保存当前结点的下一结点
代码实现
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(!pHead)return NULL; ListNode *p=pHead,*pn,*pre=NULL,*reHead; while(p){ pn=p->next; if(!pn)reHead=p; p->next=pre,pre=p,p=pn; } return reHead; }};
运行时间:2ms占用内存:472k
转载地址:https://blog.csdn.net/Jeaten/article/details/108356438 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月12日 15时02分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SAP UI5 web Component里的条件渲染机制
2019-04-27
如何使用SAP UI5 web Component的React框架的柱状图和折线图
2019-04-27
SAP UI5 web Component的React组件,如何实现事件响应
2019-04-27
CRM WebClient UI里Sales area的保存原理
2019-04-27
SpringBoot里slf4j日志功能的默认实现
2019-04-27
使用SAP云平台Portal service的前置条件
2019-04-27
SAP云平台MTA应用部署失败后的日志查看
2019-04-27
把自定义url配置到SAP Fiori Launchpad上打开
2019-04-27
使用SAP云平台portal service之前,需要做好哪些准备
2019-04-27
运行在Docker里的SpringBoot应用,如何查看记录在文件系统的日志
2019-04-27
Dockerfile里的VOLUMES关键字
2019-04-27
另一种办法直接在宿主机上的文件夹内查看Docker镜像运行的日志文件
2019-04-27
将SpringBoot应用Docker化并部署到SAP云平台
2019-04-27
SpringBoot的端口配置server.port没办法设置成Linux的环境变量
2019-04-27
SpringBoot的配置优先级,一个具体的练习例子
2019-04-27
CloudFoundry官方的几张架构图,收藏了随时备用
2019-04-27
SAP Cloud Platform里的service和Service plan
2019-04-27