NO15、反转链表(贼经典,建议多多刷,不开玩笑,要闭着眼睛写出来那种)

本文主要是介绍NO15、反转链表(贼经典,建议多多刷,不开玩笑,要闭着眼睛写出来那种),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

15、反转链表

输入一个链表,反转链表后,输出新链表的表头。

示例1
输入

{1,2,3}

返回值

{3,2,1}

很好的解答

https://blog.csdn.net/qq_42351880/article/details/88637387

1、头插法 很经典的做法啊
struct ListNode {int val;struct ListNode* next;ListNode(int x) :val(x), next(NULL) {}
}; ListNode* ReverseList(ListNode* pHead) {struct ListNode* Head = NULL;struct ListNode* node = (ListNode*)malloc(sizeof(struct ListNode));while (pHead != nullptr) {node = pHead;pHead = pHead->next;node->next = Head;Head = node;}return Head;
}void test02()
{ListNode* head = (ListNode*)malloc(sizeof(ListNode));head->val = 1;ListNode* node1 = (ListNode*)malloc(sizeof(ListNode));node1->val = 2;ListNode* node2 = (ListNode*)malloc(sizeof(ListNode));node2->val = 3;ListNode* node3 = (ListNode*)malloc(sizeof(ListNode));node3->val = 4;head->next = node1;node1->next = node2;node2->next = node3;node3->next = nullptr;auto node = ReverseList(head);while(node!=nullptr){cout << node->val << endl;node = node->next;}}
2、第二种方法,借助三个结点进行不断更替
ListNode* ReverseList(ListNode* pHead) {struct ListNode* node0 = NULL;struct ListNode* node1 = (ListNode*)malloc(sizeof(struct ListNode));struct ListNode* node2 = (ListNode*)malloc(sizeof(struct ListNode));node1 = pHead;node2 = pHead->next;while (node1 != nullptr) {node1->next = node0;node0 = node1;node1 = node2;if (node2!= nullptr) {node2 = node2 -> next;}}return node0;
}
二刷:
1、头插法来做,将元素开辟在栈上,这样会避免内存泄露

运行时间:3ms 占用内存:364k

ListNode* ReverseList(ListNode* pHead) {// 头插法if (pHead == nullptr || pHead->next == nullptr) return pHead;ListNode dummyNode = ListNode(0);ListNode* pre = &(dummyNode);pre->next = pHead;ListNode* cur = pHead->next;pHead->next = nullptr;//pre = cur;ListNode* temp = nullptr;while (cur != nullptr) {temp = cur;cur = cur->next;temp->next = pre->next;pre->next = temp;}return dummyNode.next;}
2、借助三个节点来进行迭代即可

运行时间:3ms 占用内存:504k

    ListNode* ReverseList(ListNode* pHead) {if (pHead == nullptr || pHead->next == nullptr) return pHead;ListNode * pre = nullptr,*cur = pHead,*after = pHead->next;while(cur != nullptr){//建议画个图看看就知道了cur->next = pre;pre = cur;cur = after;if(after != nullptr)after = after->next;}return pre;}

美女帅哥们如果觉得写的还行,有点用的话麻烦点个赞或者留个言支持一下阿秀~
如果觉得狗屁不通,直接留言开喷就完事了。

需要该笔记PDF版本的去个人公众号【拓跋阿秀】下回复“阿秀剑指offer笔记”即可。

这篇关于NO15、反转链表(贼经典,建议多多刷,不开玩笑,要闭着眼睛写出来那种)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628157

相关文章

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC