C#單向鏈表實現:在當前節點后插入新數據的方法Insert()

目錄

一、涉及到的知識點

1.插入算法

2.示例中current?和?_current?的作用

3.current?和?_current 能否合并為一個變量

4.單向鏈表節點類的三個屬性

(1)Next屬性:

(2)?Value屬性:

(3)Previous屬性:

二、Insert()方法實例


一、涉及到的知識點

1.插入算法

????????在單向鏈表的當前位置插入一個新的節點,在插入新節點之前,需要找到當前節點。如果當前節點為空,需要找到鏈表的最后一個節點,然后將最后一個節點設置為當前節點。這樣,新節點就可以插入到鏈表的末尾。

·????????在插入新節點時,需要正確設置新節點的 Next 和 Previous 屬性。設置新節點的 Next 和 Previous 屬性具體如下:

newNode.Next = current.Next;
newNode.Previous = current;
current.Next = newNode;
_current = newNode;

????????這樣設置確保了新節點被正確地插入到鏈表中,并且鏈表的其他部分也得到正確更新。?

2.示例中current?和?_current?的作用

????????在實例程序中,current?和?_current?的作用是有區別的。它們主要用于在插入新節點時跟蹤鏈表中的當前節點。讓我來解釋一下它們各自的用途:

  • current:是一個臨時變量,用于在插入新節點之前找到鏈表中的當前節點。如果鏈表不為空,它會從鏈表頭節點開始遍歷,直到找到最后一個節點。在這個過程中,current?會被不斷更新為當前節點的下一個節點。最后,current?會被設置為最后一個節點。
  • _current:是一個靜態變量,用于在整個鏈表操作過程中跟蹤當前節點。在插入新節點時,_current?會被設置為新插入的節點。這樣,在后續的操作中,可以使用?_current?來訪問鏈表中的當前節點。

3.current?和?_current 能否合并為一個變量

????????在源程序中將?current?和?_current?可以合并為一個變量。但是,將它們分開好處更多:

  • 代碼的可讀性:使用兩個不同的變量名可以更清楚地表明它們在代碼中的不同作用。使用?_current?作為靜態變量可以清楚地表明它在整個鏈表操作過程中的作用,而使用?current?作為局部變量可以清楚地表明它在插入新節點過程中的作用。
  • 代碼的簡潔性:將它們分開可以使代碼更簡潔。如果將它們合并為一個變量,那么在插入新節點之前需要不斷地更新這個變量。而將它們分開,只需要在找到最后一個節點后,將?_current?設置為?current,就可以完成鏈表的插入操作。

????????總之,雖然可以將?current?和?_current?統一為一個變量,但將它們分開可以使代碼更易讀、更簡潔。

4.單向鏈表節點類的三個屬性

????????在C#中,單向鏈表節點(通常稱為節點或列表節點)通常使用一個公共類來表示,該類具有三個主要屬性:

(1)Next屬性:

????????此屬性表示鏈表中當前節點的下一個節點。在單向鏈表中,只能從頭節點開始向前遍歷節點,因此每個節點僅需維護一個指向其后繼節點的引用。Next屬性通常是一個指向ListNode類型對象的引用。在鏈表的末尾,Next屬性將為null。

public class ListNode
{public int Value { get; set; }public ListNode Next { get; set; }public ListNode(int value){Value = value;}
}

?????????或

public class ListNode(int value)
{public int Value { get; set; } = value;public ListNode? Next { get; set; } = null;public ListNode? Previous { get; set; } = null;
}

(2)?Value屬性:

????????此屬性表示當前節點所存儲的值。在鏈表中,每個節點都存儲一個值,該值可以是任何類型,如int、double、string等。Value屬性通常是一個泛型類型T,以便在不同類型的鏈表中重用相同的節點類。

public class ListNode<T>
{public T Value { get; set; }public ListNode<T> Next { get; set; }public ListNode(T value){Value = value;}
}

?????????或

 public class ListNode<T>(T value){public T Value { get; set; } = value;public ListNode<T>? Next { get; set; }}

(3)Previous屬性:

????????在某些情況下,需要使用雙向鏈表即每個節點不僅維護一個指向其后繼節點的引用,還維護一個指向其前驅節點的引用。在這種情況下,Previous屬性表示鏈表中當前節點的前一個節點。Previous屬性通常是一個指向ListNode類型對象的引用。在鏈表的頭部,Previous屬性將為null。

public class ListNode<T> 
{ public T Value { get; set; } public ListNode<T> Next { get; set; } public ListNode<T> Previous { get; set; }public ListNode(T value) { Value = value; } 
}

二、Insert()方法實例

// 單向鏈表在當前位置插入新數據的方法
namespace _131_10
{public class ListNode(int value){public int Value { get; set; } = value;public ListNode? Next { get; set; } = null;public ListNode? Previous { get; set; } = null;}public class LinkedList{private static ListNode? _head;private static ListNode? _current;public LinkedList() => _head = null;/// <summary>/// 在當前位置插入數據,/// 不對數據排序,也不比較數據/// </summary>public static void Insert(int value){// 創建一個新的節點var newNode = new ListNode(value);// 如果鏈表為空,將新節點設置為頭節點if (_head == null){_head = newNode;_current = newNode;return;}// 找到當前節點var current = _current;if (current == null){//current = _head;_current = _head;while (_current.Next != null){_current = _current.Next;}current = _current;}// 在當前位置插入新節點newNode.Next = current.Next;newNode.Previous = current;current.Next = newNode;_current = newNode;}public static void Display(){var current = _head;while (current != null){Console.Write(current.Value + " ");current = current.Next;}Console.WriteLine();}class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);// 鏈表數據初始化_head = new(5){Next = new ListNode(2)};_head.Next.Next = new ListNode(8){Next = new ListNode(1)};Display();Console.WriteLine("**初始數據**");_current = _head.Next.Next; //設置當前節點為第三個節點(值為8)Insert(9);                  //在當前位置插入數據9Display(); Console.WriteLine("**插入9**");}}}
}
//運行結果:
/*
5 2 8 1
**初始數據**
5 2 8 9 1
**插入9***/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713145.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcPy】批量讀取文件夾excel中XY并轉為點shp

示例展示 代碼 只讀取excel中含有XY字段的文件&#xff0c;并將矢量命名為excel文件名稱。 import os import pandas as pd import arcpy folder_path r"C:\Users\admin\Desktop\excelfile" extension"xlsx" files [file for file in os.listdir(folder…

SpringCloud gateway限流無效,redis版本低的問題

在使用springCloud gateway的限流功能的時候&#xff0c;配置RedisRateLimiter限流無效&#xff0c;后來發現是Redis版本過低導致的問題&#xff0c;實測 Redis版本為3.0.504時限流無效&#xff0c;改用7.0.x版本的Redis后限流生效。查了資料發現很多人都遇見過這個問題&#x…

RedisTemplate 序列化成功,反序列化失敗List, Set, Map失敗

RedisTemplate 序列化成功&#xff0c;反序列化失敗List, Set, Map失敗 異常信息RedisTemplate配置異常原因錯誤代碼示例解決方法 序列化成功&#xff0c;反序列化失敗 異常信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve ty…

小程序事件處理

事件處理 一個應用僅僅只有界面展示是不夠的&#xff0c;還需要和用戶做交互&#xff0c;例如&#xff1a;響應用戶的點擊、獲取用戶輸入的值等等&#xff0c;在小程序里邊&#xff0c;我們就通過編寫 JS 腳本文件來處理用戶的操作 1. 事件綁定和事件對象 小程序中綁定事件與…

React之組件定義和事件處理

一、組件的分類 在react中&#xff0c;組件分為函數組件和class組件&#xff0c;也就是無狀態組件和有狀態組件。 * 更過時候我們應該區別使用無狀態組件&#xff0c;因為如果有狀態組件會觸發生命周期所對應的一些函數 * 一旦觸發他生命周期的函數&#xff0c;它就會影響當前項…

如何設置從小程序跳轉到其它小程序

?有的商家有多個小程序&#xff0c;希望能夠通過一個小程序鏈接到所有其它小程序&#xff0c;用戶可以通過點擊跳轉鏈接實現從一個小程序跳轉到另一個小程序。要怎么才能實現這樣的跳轉呢。下面具體介紹。 1. 設置跳轉。在小程序管理員后臺->分類管理&#xff0c;添加一個…

ssm個人學習01

Spring配置文件: spring環境的搭建: 1:導入對應的spring坐標 也就是依賴 2:編寫controller, service, dao相關的代碼 3:創建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

Node.js 中 fs 模塊文件操作的應用教程

Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c;它可以讓 JavaScript 代碼在服務器端運行。在 Node.js 中&#xff0c;fs 模塊是用來處理文件系統操作的模塊。通過 fs 模塊&#xff0c;我們可以進行文件的讀取、寫入、刪除等操作。本教程將介紹如何在 No…

工作電壓范圍寬的國產音頻限幅器D2761用于藍牙音箱,輸出噪聲最大僅-90dBV

近年來隨著相關技術的不斷提升&#xff0c;音箱也逐漸從傳統的音箱向智能音箱、無線音箱升級。同時在消費升級的背景下&#xff0c;智能音箱成為人們提升生活品質的方式之一。智能音箱是智能化和語音交互技術的產物&#xff0c;具有點歌、購物、控制智能家居設備等功能&#xf…

python水表識別圖像識別深度學習 CNN

python水表識別&#xff0c;圖像識別深度學習 CNN&#xff0c;Opencv,Keras 重點&#xff1a;項目和文檔是本人近期原創所作&#xff01;程序可以將水表圖片里面的數據進行深度學習&#xff0c;提取相關信息訓練&#xff0c;lw1.3萬字重復15%&#xff0c;可以直接上交那種&…

Vue中<style scoped lang=“scss“>的含義

這段代碼中的<style scoped lang"scss">是HTML和Vue框架結合使用時常見的一個模式&#xff0c;具體含義如下&#xff1a; scoped&#xff1a;這是一個Vue.js特有的屬性&#xff0c;用來指定樣式只應用于當前組件的元素。沒有這個屬性時&#xff0c;樣式會全局應…

python給企微發消息

方法一&#xff1a;webhook方式。使用群機器人給企微群發消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url換成自己群機器人的webhookurldata{msgtype:text,text:{content:msg}}…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多個層面的優化&#xff0c;對于開源的ES而言&#xff0c;升級是必經之路。 ES的使用場景非常多&#xff0c;在升級過程中可能會遇到非預期的結果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查詢性能問題 ES7.17版本terms查…

【Python筆記-FastAPI】后臺任務+WebSocket監控進度

目錄 一、代碼示例 二、執行說明 (一) 調用任務執行接口 (二) 監控任務進度 實現功能&#xff1a; 注冊后臺任務&#xff08;如&#xff1a;郵件發送、文件處理等異步場景&#xff0c;不影響接口返回&#xff09;監控后臺任務執行進度&#xff08;進度條功能&#xff09;支…

常見的幾種httpclient

工作是spring 項目一般都是使用ResTemplate 但是還是有些項目中會用到httpClient&#xff0c;沒有毛用。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> …

pclpy 點云法線

pclpy 點云法線 一、算法原理1.理論入門2.選擇正確的比例 二、代碼三、結果四、相關數據 一、算法原理 表面法線是幾何表面的重要屬性&#xff0c;在許多領域&#xff08;例如計算機圖形應用程序&#xff09;中大量使用&#xff0c;以應用正確的光源來生成陰影和其他視覺效果。…

緩存穿透--一起學習吧之架構

緩存穿透是指查詢一個一定不存在的數據&#xff0c;由于緩存是不命中時需要從數據庫查詢&#xff0c;查不到數據則不寫入緩存&#xff0c;這將導致這個不存在的數據每次請求都要到數據庫去查詢&#xff0c;進而給數據庫帶來壓力。在高并發場景下&#xff0c;如果某個key被高并發…

Android 混淆是啥玩意兒?

什么是混淆 Android混淆&#xff0c;是伴隨著Android系統的流行而產生的一種Android APP保護技術&#xff0c;用于保護APP不被破解和逆向分析。簡單的說&#xff0c;就是將原本正常的項目文件&#xff0c;對其類、方法、字段&#xff0c;重新命名a,b,c…之類的字母&#xff0c…

森林滅火利器|便攜式森林消防滅火泵|恒峰智慧科技

隨著人們對環境保護意識的不斷提高&#xff0c;森林防火工作顯得尤為重要。然而&#xff0c;傳統的森林滅火方式存在諸多不便&#xff0c;如火勢蔓延迅速、滅火效率低下等。為了更好地保護森林資源&#xff0c;科學家們研發出了一種便攜式森林消防滅火泵&#xff0c;它的出現為…

利用css實現常見圖形

1、正圓形 給正方形盒子設置圓角屬性為寬高的50%。 div {width: 100px;height: 100px;background-color: plum;border-radius: 50%; } 2、膠囊形 給長方形盒子設置圓角屬性為盒子高度的50%。 div {width: 200px;height: 100px;background-color: plum;border-radius: 50px…