链表创建(C#)

在C#中,链表可以通过自定义节点类实现。每个节点包含数据域和指向下一个节点的引用。

public class ListNode {public int val;public ListNode next;public ListNode(int val=0, ListNode next=null) {this.val = val;this.next = next;}
}// 创建链表示例
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);

三指针反转链表

三指针法通过维护前驱(prev)、当前(curr)和后继(next)三个指针实现链表反转,时间复杂度O(n),空间复杂度O(1)。

public ListNode ReverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next; // 保存后继节点curr.next = prev;         // 反转指针方向prev = curr;              // 前驱指针后移curr = next;              // 当前指针后移}return prev; // 新头节点
}

关键步骤解析

初始化时prev为null,curr指向头节点。每次迭代中:

  1. 临时保存curr.next避免断链
  2. 将当前节点的next指向prev
  3. 移动prevcurr指针到下一位置

边界情况处理

  • 空链表:直接返回null
  • 单节点链表:循环一次后返回原头节点
  • 多节点链表:完整遍历直至curr为null

可视化过程

原始链表:1 -> 2 -> 3 -> null
反转过程:

  1. prev=null, curr=1, next=2 → 1.next=null
  2. prev=1, curr=2, next=3 → 2.next=1
  3. prev=2, curr=3, next=null → 3.next=2 最终得到:3 -> 2 -> 1 -> null
using System;public class ListNode {public int Value;public ListNode Next;public ListNode(int value) {Value = value;Next = null;}
}public class LinkedList {private ListNode head;// 添加节点到链表尾部public void Append(int value) {//创建list的第一遍才会创建head节点,后续head是有值的。//创建一个Value字段值为value,Next字段为null的head节点,并保存为head(ListNode类)节点if (head == null) {head = new ListNode(value);return;}//head节点赋给current节点,如果当前current.Next字段不为空则往后查找直到为空,目的是为了找到list的末尾;//创建新的末尾节点,并且传入值赋予该节点ListNode current = head;while (current.Next != null) {current = current.Next;}current.Next = new ListNode(value);//注意:一轮走下来,current的位置应该是倒数第二个节点,head节点始终为第一个节点不移动。}// 反转链表public void Reverse() {ListNode previous = null;ListNode current = head;ListNode nextNode = null;while (current != null) {nextNode = current.Next;  // 暂存下一个节点current.Next = previous;  // 反转当前节点指针previous = current;       // 将previous移动到当前节点current = nextNode;       // 移动到下一个节点}head = previous;  // 更新头结点}// 打印链表public void PrintList() {ListNode current = head;while (current != null) {Console.Write(current.Value + " ");current = current.Next;}Console.WriteLine();}
}class Program {static void Main(string[] args) {LinkedList list = new LinkedList();list.Append(1);list.Append(2);list.Append(3);list.Append(4);Console.WriteLine("Original List:");list.PrintList();list.Reverse();Console.WriteLine("Reversed List:");list.PrintList();}
}

复杂度对比

方法时间复杂度空间复杂度
三指针迭代法O(n)O(1)
递归法O(n)O(n)
栈辅助法O(n)O(n)

可视化:https://www.bilibili.com/video/BV1SCtBzyESd/?spm_id_from=333.337.search-card.all.click&vd_source=fc6a649369b5583f6a3050a67ce984cd

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

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

相关文章

Android --- AOSP源码导入Android Studio

AOSP代码量庞大,为了开发的方便,我们需要导入到android studio中,其中关键的一 项就是配置跳转。尤其是对于Framework开发来说生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh会生成如下文件首先需要修改ipr和iml文件…

游戏中的设计模式——第一篇 设计模式简介

前言 对于设计模式,相信很多开发者并不陌生,我在学习过程中希望把自己的一些总结和心得体会与你分享。 本专栏主要将重点放在设计模式在游戏中的应用,会结合大家熟悉的游戏场景和功能阐述设计模式在该处应用的好处。因为设计模式很多&#xf…

SpringBoot + RustFS 实现文件切片极速上传技术

本文将手把手教你如何通过 SpringBoot 和 RustFS 构建高性能文件切片上传系统,解决大文件传输的痛点,实现秒传、断点续传和分片上传等高级功能。 目录 一、为什么选择 RustFS SpringBoot? 二、环境准备与部署 2.1 安装 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切换英文段落大小写

在Word和WPS文字中编辑英文段落时,有时候英文字母的大小写不规范,或者需要把某一段全部改为大写字母怎么办?使用ShiftF3组合键即可快速在三种模式中切换:全部大写、全部小写、首字母大写——其中首字母大写的Word是每一句话的第一…

成都金牛区哪里租好办公室?国际数字影像产业园享税收优惠

在成都金牛区租赁优质办公室,国际数字影像产业园凭借其享有的税收优惠政策,成为了许多企业的首选之地。税收优惠对于租赁办公室的企业来说,是一笔不小的成本节省。国际数字影像产业园针对入驻企业提供的税收优惠政策,能在企业运营…

CSS `:is()` `:where()` 实战指南:简化选择器,提升可维护性

🎯 CSS :is() & :where() 实战指南:简化选择器,提升可维护性你是否在项目中写过一大串重复的选择器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }这样的代码既冗长又难维护。 现在 CSS 提供了 :is() 和…

Linux I/O 访问架构深入分析

Linux I/O 访问架构深入分析 目录 概述I/O 架构层次核心数据结构I/O 处理流程VFS 虚拟文件系统块设备I/O字符设备I/O内存映射I/O异步I/O机制I/O调度器调试工具与方法性能优化策略 概述 Linux I/O 系统是一个多层次、高度抽象的架构,旨在为应用程序提供统一的文件访问…

Linux:6_基础IO

基础IO 一.理解"文件" 文件分类 1.内存级(被打开)文件 2.磁盘级文件 1. 狭义理解 文件在磁盘里磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的磁盘是外设 (即是输出设备也是输入设备)磁盘上的文件本质是对文件的所有操作,都是对外…

Coze源码分析-资源库-删除插件-前端源码-核心逻辑

删除插件逻辑 1. 删除操作入口组件 删除插件操作主要通过 usePluginConfig hook 中的 renderActions 方法实现,该方法返回 TableAction 组件来处理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地状态(Flink 1.x)

最初的架构将状态以 JVM Heap 对象的形式存储在 TaskManager 的内存中。对于小规模数据集,这种方式效果良好,但随着状态大小的增长超出内存,将所有状态保存在内存中变得成本高昂且不稳定。 为了解决状态规模增长的问题,引入了一种…

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南 关键词:印度股票数据对接 NSE实时行情 BSE证券接口 金融API开发 Python请求示例一、印度股市数据源技术解析(核心价值) 印度两大交易所数据获取难点: 时区差异&a…

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) AFSim介绍 AFSim(Advanced Framework for Simulation Integration & Modeling【高级仿真集成与…

ArcGIS学习-18 实战-降雨量空间分布插值分析

设置环境加载要素投影查看要素,发现均不是投影数据,但都是地理坐标都是WGS1984使用工具进行批量投影然后新建空地图,重新加载确认图层的投影与栅格数据一致插值样条法得到反距离权重法插值得到克里金法插值得到

HarmonyOS应用开发:深入理解声明式UI与弹窗交互的最佳实践

HarmonyOS应用开发:深入理解声明式UI与弹窗交互的最佳实践 引言 随着HarmonyOS 4.0的发布及后续版本的演进,华为的分布式操作系统已经进入了全新的发展阶段。基于API 12及以上的开发环境为开发者提供了更强大、更高效的开发工具和框架。在HarmonyOS应用…

探索Java并发编程--从基础到高级实践技巧

Thread(线程)线程 程序执行的最小单位(一个进程至少有一个线程)。线程内有自己的执行栈、程序计数器(PC),但与同进程内其他线程共享堆内存与进程资源 在java中,线程由java.lang.Thr…

Go语言实战案例-开发一个Markdown转HTML工具

这个小工具可以把 .md 文件转换为 .html 文件,非常适合写笔记、博客或者快速预览 Markdown 内容。📌 案例目标• 读取一个 Markdown 文件• 使用开源库将 Markdown 转换为 HTML• 将 HTML 输出到新文件中📦 所需库我们用 goldmark 这个 Markd…

基于51单片机的太阳能锂电池充电路灯

基于51单片机的太阳能锂电池充电路灯系统设计 1 系统功能介绍 本设计以 STC89C52单片机 为核心,构建了一个能够利用太阳能为锂电池充电并智能控制LED路灯的系统。系统结合了 光照检测电路、LED灯电路、按键检测电路、太阳能充电电路 等模块,实现了节能、…

PAT 1178 File Path

这一题的大意是给出了一个windows的文件夹目录,让我们按照所属的目录关系,来找相应的目录是否存在,如果存在,就输出找到该文件的路径,如果不存在输出error 我的思路是用合适的树形结构保存下来目录的所属关系&#xff…

云原生部署_k8s入门

K8S官网文档:https://kubernetes.io/zh/docs/home/Kubernetes是什么Kubernetes 是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 源自 ,Google 15 年生产环境的运维经验同时凝聚了社区的最佳创意和实践。简称K8s.Kubernet…

实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”

实战项目实现以下功能:功能 1:为视频每一帧添加椒盐噪声作用:模拟真实环境中图像传输或采集时可能出现的噪声。实现方式:读取视频的每一帧。随机选择 10000 个像素点,将其设置为黑色(0)或白色&a…