反转单向链表

news/2025/2/24 16:43:42/文章来源:https://www.cnblogs.com/yangkangkang/p/18734427

题目:

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

思路:

  • 链表数据结构:
    • 单向链表:{value,next}  
    • 双向链表:{value,prev,next}
    • 链表是数组的补充,数组需要一段连续的内存空间,而链表是零散的
    • 链表查询慢,新增和删除块;数组查询块,新增和删除较慢
  • 反转链表,没有捷径,我们所说的返回一个链表,实际上是返回的头节点
  • 链表只能从头部开始遍历,重新设置next 指向即可,即把前一个节点的next指向前一个节点
  • 遍历过程中,要存储3个指针 prevNode curNode nextNode
  • 时间复杂度O(n)

代码实现:

/*** @description 反转单向链表* @author ykk*/
/*** 单向链表的数据结构*/
export interface ILinkListNode {value: number,next?: ILinkListNode
}/*** 根据数组返回一个单向链表* @param arr 数组* @returns 单向链表*/
export function createLinkList(arr:number[]):ILinkListNode{const length = arr.length;if(length === 0) throw new Error('arr is empty')let curNode:ILinkListNode = {value: arr[length -1]}if(length === 1){return curNode}for(let i = length - 2; i >= 0; i--){curNode = {value: arr[i],next: curNode}}return curNode
}
/*** 反转链表* @param listNode 链表头节点* @returns 返回反转后的链表头节点*/
export function reverseLinkList(listNode:ILinkListNode):ILinkListNode{let preNode: ILinkListNode | undefined = undefinedlet curNode: ILinkListNode | undefined  = undefinedlet nextNode:ILinkListNode | undefined = listNodewhile(nextNode){//第一个元素,删掉 next, 防止循环引用if(curNode && !preNode){delete curNode.next}//反转指针if(preNode && curNode){curNode.next = preNode}preNode = curNodecurNode = nextNodenextNode = nextNode?.next}curNode!.next = preNodereturn curNode!
}

测试用例:

/*** @description 反转单链表测试* @author ykk */import {ILinkListNode,createLinkList, reverseLinkList} from './reverse-link-list'describe('反转单链表', () =>{it('单个元素',()=>{const node:ILinkListNode = {value: 100}const node1 = reverseLinkList(node)expect(node1).toEqual({value: 100})})it('多个元素',() =>{const node = createLinkList([100,200,300])const node1 = reverseLinkList(node)expect(node1).toEqual({value:300,next: {value: 200,next:{value: 100}}})})
})

 

 

 

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python异步编程终极指南:用协程与事件循环重构你的高并发系统

title: Python异步编程终极指南:用协程与事件循环重构你的高并发系统 date: 2025/2/24 updated: 2025/2/24 author: cmdragon excerpt: 🚀 深入剖析Python异步编程的核心机制。你将掌握:\n 事件循环的底层实现原理与调度算法\n async/await协程的6种高级用法模式\n 异步H…

Uniapp开发安卓app之使用360加固加壳处理

Uniapp开发安卓app之使用360加固加壳处理 注:360加固只针对Android App免费。360加固助手官方下载 1.流程 安卓加固 》 签名APK 2.前提 先使用Hbuilder完成app打包,得到apk文件。 3.安卓加固1)安装、登录360加固软件并打开 2)在安卓加固》APK加固》添加任务,选择hbi…

用python画五角星

import turtle turtle.setup(500,500) turtle.bgcolor("white") turtle.pensize(3) turtle.color("red") turtle.begin_fill() for _ in range(5): turtle.forward(200) turtle.right(144) turtle.end_fill() turtle.hideturtle() turtle.done()

win10忘记开机密码怎么办?

下面我们来看看win10笔记本电脑开机密码忘记了怎么办_ 方法一、重置电脑,但是数据可能会丢失 1、开机,在看到Windows10Logo,下面有个圆圈在转的时候,数5秒。然后直接按下电源键关机。2.桌面,如果您的台式机有重新启动键,也可以直接按重新启动键。这样重复2~3次。 三、鼠标…

mysql知识面试day1

1.介绍mysql MYSQL是一个关系型数据库 2.事务的四大特性 acidA原子性表示要么全部成功要么全部失败 C一致性事务执行前和执行后需要保持一致的状态 I隔离性一个事务只能读到已提交的更改 D持久性事务一旦被提交更改就是永久性的3.数据库的三大范式 第一范式inf:确保字段的原子性…

图像采集卡功能与应用详解

图像采集卡(Image Capture Card),也称为视频采集卡或图像采集设备,是一种用于将摄像头、相机、显微镜、传感器等设备输出的图像或视频信号转换为计算机可处理的数字信号的硬件设备。它在工业检测、医疗影像、机器视觉、安防监控、科学研究等领域有广泛应用。 一、核心功能 …

项目管理工具-禅道(2)

一、bug的等级 (1)1级bug (致命bug) (2)2级bug(严重bug) (3)3级bug(一般bug) (4)4级bug(简易性bug) 划分: 1级bug (致命bug) 必须优先修改,在测试中较少出现,一旦出现应立即中止当前版本测试; 致命bug: (1)常规操作引起的崩溃,死机,死循环,内存泄露…

npccctf第一周wp

1、全网呼叫密码人 题目 from Crypto.Cipher import AES from Crypto.Util.number import * from Crypto.Util.Padding import pad """ Dinzheng先生准备去买一根RuiKeV电子烟,在付款的时候忘记了它的支付密码。 还好他的朋友早有准备,留下了若干个密保问题,…

如何利用CRM系统进行客户细分和精准营销?

——怎么做才能在CRM系统里对客户进行细分并精准营销呢? 我有一个朋友这么问我。 其实,想做到这个并不难,不过需要先明白这两个的核心概念是什么。简单来说,客户细分——根据客户的不同特点,把客户分成几个群体。 精准营销——根据这些细分好的群体,量身定制符合他们需求…