前端最高频的算法题之一!反转链表
完整高频题库仓库地址:https://github.com/hzfe/awesome-interview
完整高频题库阅读地址:https://febook.hzfe.org/
题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解法一:迭代(双指针)
本方法是对链表进行遍历,然后在访问各节点时修改 next 的指向,达到反转链表的目的。
- 初始化 cur 和 pre 两个节点,分别指向 head 和 null。
- 对链表进行循环,声明 temp 节点用来保存当前节点的下一个节点。
- 修改当前节点 cur 的 next 指针指向为 pre 节点。
- pre 节点修改为 cur 节点。
- cur 节点修改为 temp 节点。
- 继续进行处理,直到 cur 节点为 null,返回 pre 节点。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
const reverseList = (head) => {
let cur = head; // 正向链表的头指针
let pre = null; // 反向链表的头指针
while (cur) {
const temp = cur.next; // 暂存当前节点的后续节点,用于更新正向链表
cur.next = pre; // 将当前节点指向反向链表,这是一个建立反向链接的过程
pre = cur; // 更新反向链表的头指针为当前已处理的节点,反向链表的该轮构建完成
cur = temp; // 将正向链表头指针替换为暂存的节点,正向链表处理完成,开始下一轮处理
}
return pre;
};
复杂度分析
- 时间复杂度 O(N):遍历链表使用线性大小时间。
- 空间复杂度 O(1):变量 pre 和 cur 使用常数大小额外空间。
解法二:递归
当使用递归对链表进行处理时,从链表的第一个节点出发,然后找到最后一个节点,该节点就是反转链表的头结点,然后进行回溯处理。
- 初始链表的头结点,head 标识。
- 如果 head 为空或者 head.next 为空,返回 head。
- 定义 reverseHead 节点,保存反转的链表值。
- 每次让 head 下一个节点的 next 指向 head,形成反转。
- 递归处理到最后一个节点,返回 reverseHead。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
const reverseList = (head) => {
// 判断当前节点是否还需要处理
if (head == null || head.next == null) {
return head;
}
// 递归处理后续节点
const reverseHead = reverseList(head.next);
// 局部反转节点
head.next.next = head;
head.next = null;
return reverseHead;
};
复杂度分析:
- 时间复杂度 O(N):n 是链表的长度,需要对链表的每个节点进行反转操作。
- 空间复杂度 O(N):n 是链表的长度,空间复杂度主要取决于递归调用的栈空间,最多为 n 层。
参考资料
34 声望
4 粉丝
推荐阅读
JavaScript 异步编程
完整高频题库仓库地址:[链接]完整高频题库阅读地址:[链接]相关问题JavaScript 异步编程方案有哪些JavaScript 异步编程方案各有什么优缺点回答关键点阻塞 事件循环 回调函数JavaScript 是一种同步的、阻塞的、单...
HZFEStudio阅读 789
从零搭建 Node.js 企业级 Web 服务器(零):静态服务
过去 5 年,我前后在菜鸟网络和蚂蚁金服做开发工作,一方面支撑业务团队开发各类业务系统,另一方面在自己的技术团队做基础技术建设。期间借着 Node.js 的锋芒做了不少 Web 系统,有的至今生气蓬勃、有的早已夭折...
乌柏木赞 143阅读 12k评论 10
从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...
乌柏木赞 60阅读 6k评论 16
再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...
libinfs赞 39阅读 6.2k评论 12
从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...
乌柏木赞 41阅读 7.2k评论 6
CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(>^ω^<...
XboxYan赞 42阅读 2.8k评论 14
还在用 JS 做节流吗?CSS 也可以防止按钮重复点击
举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如只允许每300ms提交一次,这时候我想大部分同学都会到网上直接拷贝一段throttle函数,或者直接引用lodash工具库
XboxYan赞 34阅读 2.3k评论 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。