C#(鏈表創建與原地反轉)

鏈表創建(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…