C#單向鏈表實現:用泛型類在當前位置插入新數據的方法Insert()

一、涉及到的知識點

1.ListNode<T>類

????????ListNode<T>是一個泛型類,用于表示鏈表中的一個節點。Value和Next屬性是ListNode<T>最基本的屬性,用于表示節點的值和指向下一個節點的引用。但是,完全可以根據實際需求添加其他屬性,例如一個指向前一個節點的引用的Previous的屬性,它是一個可空的ListNode<T>類型,表示前一個節點的引用。這個屬性可以用于實現雙向鏈表,其中每個節點都有一個指向前一個節點和下一個節點的引用。

????????總之,ListNode<T>類的屬性數量和類型取決于工程需求。在實際開發中,可以根據實際需求自定義ListNode<T>類。

????????ListNode<T>中,Value屬性存儲節點的值,而Next屬性是指向鏈表中下一個節點的引用。Next屬性的類型為ListNode<T>,這意味著它指向相同類型的節點。這種設計使得使用相同類型的節點來構建一個鏈表,而不需要為每個節點創建一個特定的類型。

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

2.LinkedList<T>類

????????LinkedList<T>類是一個泛型類,用于實現鏈表數據結構。鏈表是一種線性數據結構,其中每個元素(節點)包含一個值和指向下一個元素(節點)的引用。LinkedList<T>類在C#中通常用于存儲相同類型的元素集合。LinkedList<T>類的主要特點包括:

  • 泛型類型參數T:允許存儲任何類型的數據,只要它們實現了System.IEquatable<T>接口。
  • 節點類:LinkedList<T>使用內部類ListNode<T>表示鏈表中的節點。ListNode<T>包含一個值(Value屬性)和對下一個節點的引用(Next屬性)。
  • 頭部和尾部節點:LinkedList<T>維護兩個節點引用:_head表示鏈表的頭部節點,_tail表示鏈表的尾部節點。當向鏈表中添加或刪除節點時,這些引用會相應地更新。
  • 插入和刪除節點:LinkedList<T>提供了一些方法來插入和刪除節點,如AddFirst、AddLast、Insert、Remove等。這些方法會更新頭部和尾部節點的引用,以保持鏈表的正確性。
  • 遍歷鏈表:LinkedList<T>提供了一些方法來遍歷鏈表中的節點,如GetEnumerator。這使得我們可以使用foreach循環來訪問鏈表中的所有節點。

????????C#標準庫中已經提供了System.Collections.Generic.LinkedList<T>類。在實際開發中,可以直接使用這個類,而無需自己實現。在使用LinkedList<T>時,只需要設計實現自己的工程需要的方法,這些方法是自定義的。

public class LinkedList<T>
{private static ListNode<T>? _head;private static ListNode<T>? _current;public static ListNode<T>? Current { get => _current; set => _current = value; }public static ListNode<T>? Head { get => _head; set => _head = value; }public LinkedList() => _head = null;/// <summary>/// 泛型類在鏈表尾部插入新數據/// 追加新數據/// </summary>public void Append(T value){var newNode = new ListNode<T>(value);if (_head == null){_head = newNode;}else{var current = _head;while (current.Next != null){current = current.Next;}current.Next = newNode;_current = newNode;}}/// <summary>/// 在當前位置插入數據,/// 不對數據排序,也不比較數據/// </summary>public static void Insert(T value){// 創建一個新的節點var newNode = new ListNode<T>(value);// 如果鏈表為空,將新節點設置為頭節點if (_head == null){_head = newNode;_current = newNode;return;}// 找到當前節點var current = _current;if (current == null){_current = _head;while (_current.Next != null){_current = _current.Next;}current = _current;}// 在當前位置插入新節點newNode.Next = current.Next;newNode.Previous = current;current.Next = newNode;_current = newNode;}/// <summary>/// 輸出鏈表數據/// </summary>public static void PrintList(){var current = _head;while (current != null){Console.Write(current.Value + " ");current = current.Next;}Console.WriteLine();}/// <summary>/// 當前節點指針移動到鏈表頭/// 當前節點=頭節點/// </summary>public static void MoveFirst(){if (_head != null){_current = _head;}}/// <summary>/// 當前節點指針移動到下一個節點/// 當前節點=下一個節點/// </summary>public static void MoveNext(){if (_current != null && _current.Next != null){_current = _current.Next;}}
}

????????在LinkedList<T>類中,_head屬性是一個ListNode<T>類型的變量,用于存儲鏈表的頭部節點。當向鏈表中插入新節點時,我們會創建一個新的ListNode<T>實例,并將其設置為_head或將其附加到現有鏈表的末尾。鏈表的遍歷過程也會使用ListNode<T>類,逐個訪問鏈表中的節點。

二、Main方法的實例

class Program{public static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);var list = new LinkedList<int>();list.Append(5);list.Append(2);list.Append(8);list.Append(1);LinkedList<int>.PrintList(); // 輸出:1 8 2 5list.Append(11);LinkedList<int>.PrintList(); // 輸出:1 8 2 5 11LinkedList<int>.MoveFirst();LinkedList<int>.Insert(12);LinkedList<int>.PrintList();LinkedList<int>.MoveNext();LinkedList<int>.Insert(13);LinkedList<int>.PrintList();}}    
//運行結果:
/*
5 2 8 1
5 2 8 1 11
5 12 2 8 1 11
5 12 2 13 8 1 11*/

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

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

相關文章

雙非二本找實習前的準備day5

學習目標&#xff1a; 每天2-3到簡單sql&#xff08;刷完即止&#xff09;&#xff0c;每天復習代碼隨想錄上的題目3道算法&#xff08;時間充足可以繼續&#xff09;&#xff0c;今天的八股背少一點&#xff0c;MySQL和Redis各1-2道好了&#xff0c;主攻復習是java基礎 今日…

C語言5道編程題簡單介紹(三)

1、打印楊輝三角 程序分析&#xff1a; 結構如下所示&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1代碼如下&#xff1a; #include <stdio.h>int main() {int i,j;int a[10][10];printf("\n");for(i0;i<10;i) {a[i][0]1;a…

Vuex 是什么?它在 Vue 應用中扮演什么角色?解釋一下 Vuex 的狀態管理模式。如何在 Vuex 中進行異步操作?

一、Vuex 是什么&#xff1f; Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 的出現解決了多個組件間共享狀態的問題&#xff0c;使得狀態管理變得更加直…

#WEB前端(HTML屬性)

1.實驗&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; a: href插入超鏈接 默認情況下在本窗口打開鏈接, target可以設置打開的窗口,parent在父窗口打開&#xff0c;blank新開串口打開,top在頂層串口打開,self為默認在本窗口打開 img: 插入圖片 可以插…

解析/區分MOS管的三個引腳G、S、D(NMOS管和PMOS管)

MOS管的三個引腳分別是Gate&#xff08;柵極&#xff09;、Source&#xff08;源極&#xff09;和Drain&#xff08;漏極&#xff09;。以下是詳細介紹&#xff1a; Gate&#xff08;柵極&#xff09;。這是控制MOS管開關的關鍵引腳&#xff0c;用于控制電流的流通。Source&…

智能分析網關V4安全帽檢測/反光衣檢測/通用工服檢測算法及應用

TSINGSEE青犀視頻智能分析網關V4內置了近40種AI算法模型&#xff0c;支持對接入的視頻圖像進行人、車、物、行為等實時檢測分析&#xff0c;上報識別結果&#xff0c;并能進行語音告警播放。硬件管理平臺支持RTSP、GB28181協議、以及廠家私有協議接入&#xff0c;可兼容市面上常…

【DDD】學習筆記-實體和值對象:從領域模型的基礎單元看系統設計

今天我們來學習 DDD 戰術設計中的兩個重要概念&#xff1a;實體和值對象。 這兩個概念都是領域模型中的領域對象。它們在領域模型中起什么作用&#xff0c;戰術設計時如何將它們映射到代碼和數據模型中去&#xff1f;就是我們這一講重點要關注的問題。 另外&#xff0c;在戰略…

springboot238光影視頻

光影視頻平臺 摘 要 使用舊方法對光影視頻平臺的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在光影視頻平臺的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開…

APS面試審核準備的常規問題

之前根據其他人的經驗貼&#xff0c;準備了一些可能APS 面試審核可能會遇到的常規問題&#xff0c;現在簡單分享一下。 一般會考慮到留學資金來源&#xff0c;在德國能不能順利畢業&#xff1b;學的是什么專業內容之類的&#xff0c;判斷去德國會不會好好學習&#xff1b;對德國…

Linux:上傳文件到虛擬機

常見的方法&#xff1a; 使用虛擬機軟件提供的文件共享功能&#xff1a; 對于VMware Workstation&#xff0c;可以使用“共享文件夾”功能。對于VirtualBox&#xff0c;可以使用“共享文件夾”或“拖放”功能。 使用網絡文件共享服務&#xff1a; 您可以在虛擬機中配置一個Sam…

【Python入門教程】Python實現雞兔同籠

今天跟大家分享一下很久之前自己做的雞兔同籠求解問題的小游戲&#xff0c;使用公式和基本的判斷語句即可實現&#xff0c;可以用來當練手或者消磨時間用。 大家在編代碼的時候最重要就是先理清邏輯思路&#xff0c;例如應該套幾層循環、分幾個模塊等等。然后在編碼時可以先隨意…

TS中符號的用法:?、??、 !、 !!

1) ? 的用法 示例&#xff1a; const obj res?.data || {}; // obj是從接口中取到的數據const dataError obj.a.b; // 若obj為空&#xff0c;則此時會報錯const dataSafe obj?.a?.b; // 相當于 const dataSafe obj && obj.a && obj.a.b ? obj.a.b…

wy的leetcode刷題記錄_Day80

wy的leetcode刷題記錄_Day80 聲明 本文章的所有題目信息都來源于leetcode 如有侵權請聯系我刪掉! 時間&#xff1a;2024-3-2 前言 目錄 wy的leetcode刷題記錄_Day80聲明前言2368. 受限條件下可到達節點的數目題目介紹思路代碼收獲 92. 反轉鏈表 II題目介紹思路代碼收獲 2368…

Redis持久化+Redis內存管理和優化+Redis三大緩存問題

Redis持久化Redis內存管理和優化Redis三大緩存問題一、Redis高可用二、Redis持久化1、RDB持久化1.1 觸發條件(1) 手動觸發(2) 自動觸發(3) 其他自動觸發機制 1.2 執行流程1.3 啟動時加載 2、AOF持久化2.1 開啟AOF2.2 執行流程(1) 命令追加(append)(2) 文件寫入(write)和文件同步…

讀書筆記-三國演義-荊州爭奪

荊州爭奪 赤壁之戰后&#xff0c;荊州成為蜀漢、曹魏和孫吳三方爭奪的焦點。劉備、曹操和孫權相繼占據荊州&#xff0c;展開了一系列激烈的軍事沖突和政治斗爭。 赤壁之戰后的荊州爭奪是三國時期曹操、劉備和孫權之間的一場激烈競爭&#xff0c;是繼赤壁之戰后三方勢力之間的…

網絡編程筆記

網絡編程 1.網絡編程常用工具 1.掃描器 每一個網絡編程者手中都有一兩個用得順手的掃描器&#xff0c;掃描器在一個老練的網絡編程者手里有著相當大的作用。利用掃描器&#xff0c;網絡編程者可以對某一網段的機器或是某臺目標機器進行快速漏洞掃描&#xff0c;因為傳統的手…

langchain學習筆記(十)

Bind runtime args | &#x1f99c;?&#x1f517; Langchain 1、有時&#xff0c;我們希望使用常量參數調用Runnable序列中的Runnable&#xff0c;這些參數不是序列中前一個Runnable的輸出的一部分&#xff0c;也不是用戶的輸入&#xff0c;這時可以用Runnable.bind() from …

關于synchronized介紹

synchronized的特性 1. 樂觀鎖/悲觀鎖自適應,開始時是樂觀鎖,如果鎖沖突頻繁,就轉換為悲觀鎖 2.輕量級/重量級鎖自適應 開始是輕量級鎖實現,如果鎖被持有的時間較長,就轉換成重量級鎖 3.自旋/掛起等待鎖自適應 4.不是讀寫鎖 5.非公平鎖 6,可重入鎖 synchronized的使用 1&#…

2024家用洗地機品牌推薦!洗地機選什么牌子好?建議選擇這幾款

如今生活節奏加快&#xff0c;工作繁忙的上班族很少有時間做家務。即使抽出時間打掃&#xff0c;也難以保持家庭長久干凈整潔。許多人聽說了智能化家居神器——洗地機&#xff0c;想要入手一臺。但在市場上各種洗地機層出不窮&#xff0c;很多人不知如何選擇。下面是我給大家整…

掌握MyBatis:輕松解鎖數據庫操作的藝術

MyBatis是一款優秀的持久層框架&#xff0c;它封裝了JDBC操作的很多繁瑣細節&#xff0c;提供了一種相對簡便的操作數據庫的方法。MyBatis通過XML描述接口綁定的SQL語句&#xff0c;以及通過Java注解的方式&#xff0c;將Java對象與數據庫表進行映射&#xff0c;從而簡化了數據…