C#進階學習(四)單向鏈表和雙向鏈表,循環鏈表(上)單向鏈表

目錄

前置知識:

一、鏈表中的結點類LinkedNode

1、申明字段節點類:

2、申明屬性節點類:

二、兩種方式實現單向鏈表

①定框架:

②增加元素的方法:因為是單鏈表,所以增加元素一定是只能在末尾添加元素,即在頭結點后面添加元素

③刪除元素的方法:刪除鏈表中第一個符合刪除目標值的節點?

④查找節點是否存在,這個就很簡單,直接遍歷一遍就好了。

?⑤更新某一個節點的數據

三、測試?

測試接口:

寫一個測試函數:

開始測試:

測試結果:


前置知識:

? ? ? ? 數據結構:

數據結構:數據元素之間的相互關系
常用的數據結構
數組、鏈表、棧、隊列、樹、圖,堆,散列表

?????????線性表:

線性表是一種數據結構是由n個具有相同特性的數據元素的有限序列
例如:數組、鏈表、棧、隊列,ArrayList

????????順序存儲:

數組、Stack、Queue、ArrayList->順序存儲
只是 數組、Stack、Queue、ArrayList的組織規則不同而已
順序存儲
用一組地址連續的存儲單元依次存儲線性表的各個元素,數據元素之間的邏輯關系由存儲單元的鄰接關系來體現。內存地址連續,一整片的內存

順序存儲鏈式存儲 是數據結構中的兩種存儲方式??

????????鏈式存儲:

單向鏈表、雙向鏈表、循環鏈表->鏈式存儲
鏈式存儲(鏈接存儲)
用一組任意的存儲單元存儲線性表中的各個數據元素,內存地址不連續跳躍式的。

如需了解更多,可看這一篇文章:

線性表的相關知識

? 好的,回歸主線,今天咱們學習的重點是單向鏈表以及雙向鏈表,循環鏈表

一、鏈表中的結點類LinkedNode

?????????什么是LinkedNode呢,他有什么作用呢?他其實就是組成鏈表的基本單位,鏈表就是一個個的LinkedNode串起來的,只不過串的方式不太一樣。下面代碼示例中不一定使用的是LinkedNode這個名字,使用的是其他的名字不過沒關系,學習而已。例如:

? ? ? ? 在單向鏈表中:每個鏈表結點有一個指向下一個鏈表結點的類似于C語言中的指針的東西,就是說明了,當前節點的下一個就是你,二者建立了聯系。對于單向鏈表中,第一個結點,我們稱之為頭結點,因為他只能向后指,不能朝前看,所以每次尋找某一個元素,需要進行遍歷,而且你永遠找不到自己的上一個元素是什么。于是有了雙向鏈表

? ? ? ? 在雙向鏈表中:每個鏈表節點存有兩個指針,一個是指向當前結點的上一個結點,一個是指向當前結點的下一個結點,其余的和單向鏈表相同。

? ? ? ? 所謂循環鏈表:就是在單鏈表中,將最后一個結點的下一個指向第一個結點。

好的,接下來我們實現這個節點類:

? ? ?單向鏈表的節點類:

兩種定義方式:

1、申明字段節點類:

/// <summary>
/// 單向鏈表節點定義(字段版本)
/// </summary>
/// <typeparam name="T">泛型數據類型</typeparam>
public class ListNode_Field<T>
{// 節點存儲的數據(字段)public T data;// 指向下一個節點的指針(字段)// "?" 表示這是一個可空類型,允許值為 nullpublic ListNode_Field<T>? next;/// <summary>/// 構造函數/// </summary>/// <param name="val">節點數據</param>public ListNode_Field(T val){data = val;next = null;}
}

2、申明屬性節點類:

/// <summary>
/// 單向鏈表節點定義(屬性版本)
/// </summary>
/// <typeparam name="T">泛型數據類型</typeparam>
public class SingleListNode<T>
{// 節點存儲的數據(屬性)public T Data { get; set; }// 指向下一個節點的指針(屬性)// "?" 表示這是一個可空類型,允許值為 nullpublic SingleListNode<T>? Next { get; set; }/// <summary>/// 構造函數/// </summary>/// <param name="data">節點數據</param>public SingleListNode(T data){Data = data;Next = null; // 初始化時指針置空}
}

?????????這兩種方式任意選擇一種進行申明即可,推薦使用屬性,因為可以自己處理的手段更多。

二、兩種方式實現單向鏈表

????????好的接下來我們實現一個單向鏈表,因為有了這些基本節點類,所以才會有下面的代碼。同樣我們會使用屬性節點類和字段節點類進行說明。其實都差不多的。

? ? ? ? 總的設計思路:

? ? ? ? 1、提供一個頭結點

? ? ? ? 2、利用這個頭結點進行增刪改查

? ? ? ? 接下來我們一一實現:下面是一個利用字段節點聲明的單向鏈表

①定框架:

    public class SingleLinkedList_Field<T>{//設置一個私有頭結點private ListNode_Field<T>? head;}

②增加元素的方法:因為是單鏈表,所以增加元素一定是只能在末尾添加元素,即在頭結點后面添加元素

? ? ? ? 步驟:

(1)先申明一個新的節點

(2)判斷頭結點是否為空,為空則添加的元素就是頭結點元素,反之遍歷找到最后一個節點,然后將最后一個結點的next指向當前新創造的節點

/// <summary>
/// 在鏈表尾部添加新節點
/// </summary>
public void Add(T data)
{ListNode_Field<T> newNode = new ListNode_Field<T>(data);if (head == null){head = newNode;return;}// 遍歷鏈表找到最后一個節點ListNode_Field<T> current = head;while (current.next != null){current = current.next;}current.next = newNode; // 直接操作字段
}

????????當然這個添加元素,你也可以想想怎么在中間插入一個元素,思想是將上一個的next指向插入元素,插入元素的next指向上一個元素的下一個?

③刪除元素的方法:刪除鏈表中第一個符合刪除目標值的節點?

? ? ? ? 步驟:

(1)先看有沒有頭結點,沒有頭結點刪除個屁啊

(2)然后看刪除的是不是頭結點,是的話直接將頭結點的next指向下一個就好啦

(3)不是頭結點的話,就稍微有一點點麻煩,需要先遍歷,和Add方法差不多的

/// <summary>
/// 刪除第一個匹配的節點
/// </summary>
public bool Remove(T data)
{if (head == null) return false;// 處理頭節點匹配的情況if (head.data != null && head.data.Equals(data)){head = head.next; // 直接操作字段return true;}ListNode_Field<T> current = head;while (current.next != null){if (current.next.data != null && current.next.data.Equals(data)){current.next = current.next.next; // 直接操作字段return true;}current = current.next;}return false;
}

④查找節點是否存在,這個就很簡單,直接遍歷一遍就好了。

/// <summary>
/// 查找節點是否存在
/// </summary>
public bool Contains(T data)
{ListNode_Field<T>? current = head;while (current != null){if (current.data != null && current.data.Equals(data)){return true;}current = current.next;}return false;
}

?⑤更新某一個節點的數據

? ? ? ? 步驟:

(1)找到該節點

(2)操作該節點的數據

/// <summary>
/// 更新第一個匹配的節點的值
/// </summary>
public bool Update(T oldData, T newData)
{ListNode_Field<T>? node = FindNode(oldData);if (node == null) return false;node.data = newData; // 直接操作字段return true;
}/// <summary>
/// 輔助方法:查找指定數據的節點
/// </summary>
private ListNode_Field<T>? FindNode(T data)
{ListNode_Field<T>? current = head;while (current != null){if (current.data != null && current.data.Equals(data)){return current;}current = current.next;}return null;
}

????????好的,那么我們就完成了一個最簡單的單向鏈表的數據結構!

附上使用屬性申明的單行鏈表,是一樣的:

    /// <summary>/// 單向鏈表實現(屬性版本)/// </summary>/// <typeparam name="T">泛型數據類型</typeparam>public class SingleLinkedList_Property<T> : ISingleLinkedList<T>{// 頭節點(私有屬性)private SingleListNode<T>? head;/// <summary>/// 在鏈表尾部添加新節點/// </summary>/// <param name="data">要添加的數據</param>public void Add(T data){// 顯式聲明類型(不使用 var)SingleListNode<T> newNode = new SingleListNode<T>(data);if (head == null){head = newNode; // 鏈表為空時,新節點作為頭節點return;}// 遍歷鏈表找到最后一個節點SingleListNode<T> current = head;while (current.Next != null){current = current.Next;}current.Next = newNode; // 將新節點鏈接到尾部}/// <summary>/// 刪除第一個匹配的節點/// </summary>/// <param name="data">要刪除的數據</param>/// <returns>是否刪除成功</returns>public bool Remove(T data){if (head == null) return false;// 處理頭節點匹配的情況if (head.Data != null && head.Data.Equals(data)){head = head.Next; // 頭節點指向下一個節點return true;}// 遍歷鏈表查找匹配的節點SingleListNode<T> current = head;while (current.Next != null){if (current.Next.Data != null && current.Next.Data.Equals(data)){current.Next = current.Next.Next; // 跳過匹配的節點return true;}current = current.Next;}return false;}/// <summary>/// 查找節點是否存在/// </summary>/// <param name="data">要查找的數據</param>/// <returns>是否存在</returns>public bool Contains(T data){SingleListNode<T>? current = head;while (current != null){if (current.Data != null && current.Data.Equals(data)){return true;}current = current.Next;}return false;}/// <summary>/// 更新第一個匹配的節點的值/// </summary>/// <param name="oldData">舊數據</param>/// <param name="newData">新數據</param>/// <returns>是否更新成功</returns>public bool Update(T oldData, T newData){SingleListNode<T>? node = FindNode(oldData);if (node == null) return false;node.Data = newData; // 直接修改節點的數據return true;}/// <summary>/// 輔助方法:查找指定數據的節點/// </summary>private SingleListNode<T>? FindNode(T data){SingleListNode<T>? current = head;while (current != null){if (current.Data != null && current.Data.Equals(data)){return current;}current = current.Next;}return null;}}

三、測試?

????????測試部分呢,因為兩種都差不多,所以我們使用一個接口,讓他們都實現里面的方法,然后統一測試

測試接口:

/// <summary>
/// 統一接口(便于測試不同版本的鏈表)
/// </summary>
public interface ISingleLinkedList<T>
{void Add(T data);bool Remove(T data);bool Contains(T data);bool Update(T oldData, T newData);
}

兩個鏈表只要繼承了這個接口就好

寫一個測試函數:

static void TestLinkedList<T>(T list) where T : ISingleLinkedList<int>
{// 添加節點list.Add(1);list.Add(2);list.Add(3);Console.WriteLine("添加 1, 2, 3 后鏈表內容應為:1 -> 2 -> 3");// 測試查找Console.WriteLine("查找 2: " + list.Contains(2)); // 應輸出 TrueConsole.WriteLine("查找 4: " + list.Contains(4)); // 應輸出 False// 測試刪除list.Remove(2);Console.WriteLine("刪除 2 后鏈表內容應為:1 -> 3");Console.WriteLine("查找 2: " + list.Contains(2)); // 應輸出 False// 測試更新list.Update(3, 4);Console.WriteLine("更新 3 為 4 后鏈表內容應為:1 -> 4");Console.WriteLine("查找 4: " + list.Contains(4)); // 應輸出 True
}

開始測試:

 static void Main(string[] args){// 測試屬性版本鏈表Console.WriteLine("測試屬性版本鏈表:");TestLinkedList(new SingleLinkedList_Property<int>());// 測試字段版本鏈表Console.WriteLine("\n測試字段版本鏈表:");TestLinkedList(new SingleLinkedList_Field<int>());}

測試結果:

?如果再講雙向鏈表和循環鏈表,會顯得很雜亂,我們將會在下一篇文章討論,諸位共勉!

附:本文所有代碼

namespace 單向鏈表
{/// <summary>/// 單向鏈表節點定義(屬性版本)/// </summary>/// <typeparam name="T">泛型數據類型</typeparam>public class SingleListNode<T>{// 節點存儲的數據(屬性)public T Data { get; set; }// 指向下一個節點的指針(屬性)// "?" 表示這是一個可空類型,允許值為 null(解決 CS8618 警告)public SingleListNode<T>? Next { get; set; }/// <summary>/// 構造函數/// </summary>/// <param name="data">節點數據</param>public SingleListNode(T data){Data = data;Next = null; // 初始化時指針置空}}/// <summary>/// 單向鏈表節點定義(字段版本)/// </summary>/// <typeparam name="T">泛型數據類型</typeparam>public class ListNode_Field<T>{// 節點存儲的數據(字段)public T data;// 指向下一個節點的指針(字段)// "?" 表示這是一個可空類型,允許值為 nullpublic ListNode_Field<T>? next;/// <summary>/// 構造函數/// </summary>/// <param name="val">節點數據</param>public ListNode_Field(T val){data = val;next = null;}}internal class Program{static void Main(string[] args){// 測試屬性版本鏈表Console.WriteLine("測試屬性版本鏈表:");TestLinkedList(new SingleLinkedList_Property<int>());// 測試字段版本鏈表Console.WriteLine("\n測試字段版本鏈表:");TestLinkedList(new SingleLinkedList_Field<int>());}static void TestLinkedList<T>(T list) where T : ISingleLinkedList<int>{// 添加節點list.Add(1);list.Add(2);list.Add(3);Console.WriteLine("添加 1, 2, 3 后鏈表內容應為:1 -> 2 -> 3");// 測試查找Console.WriteLine("查找 2: " + list.Contains(2)); // 應輸出 TrueConsole.WriteLine("查找 4: " + list.Contains(4)); // 應輸出 False// 測試刪除list.Remove(2);Console.WriteLine("刪除 2 后鏈表內容應為:1 -> 3");Console.WriteLine("查找 2: " + list.Contains(2)); // 應輸出 False// 測試更新list.Update(3, 4);Console.WriteLine("更新 3 為 4 后鏈表內容應為:1 -> 4");Console.WriteLine("查找 4: " + list.Contains(4)); // 應輸出 True}}/// <summary>/// 統一接口(便于測試不同版本的鏈表)/// </summary>public interface ISingleLinkedList<T>{void Add(T data);bool Remove(T data);bool Contains(T data);bool Update(T oldData, T newData);}/// <summary>/// 單向鏈表實現(屬性版本)/// </summary>/// <typeparam name="T">泛型數據類型</typeparam>public class SingleLinkedList_Property<T> : ISingleLinkedList<T>{// 頭節點(私有屬性)private SingleListNode<T>? head;/// <summary>/// 在鏈表尾部添加新節點/// </summary>/// <param name="data">要添加的數據</param>public void Add(T data){// 顯式聲明類型(不使用 var)SingleListNode<T> newNode = new SingleListNode<T>(data);if (head == null){head = newNode; // 鏈表為空時,新節點作為頭節點return;}// 遍歷鏈表找到最后一個節點SingleListNode<T> current = head;while (current.Next != null){current = current.Next;}current.Next = newNode; // 將新節點鏈接到尾部}/// <summary>/// 刪除第一個匹配的節點/// </summary>/// <param name="data">要刪除的數據</param>/// <returns>是否刪除成功</returns>public bool Remove(T data){if (head == null) return false;// 處理頭節點匹配的情況if (head.Data != null && head.Data.Equals(data)){head = head.Next; // 頭節點指向下一個節點return true;}// 遍歷鏈表查找匹配的節點SingleListNode<T> current = head;while (current.Next != null){if (current.Next.Data != null && current.Next.Data.Equals(data)){current.Next = current.Next.Next; // 跳過匹配的節點return true;}current = current.Next;}return false;}/// <summary>/// 查找節點是否存在/// </summary>/// <param name="data">要查找的數據</param>/// <returns>是否存在</returns>public bool Contains(T data){SingleListNode<T>? current = head;while (current != null){if (current.Data != null && current.Data.Equals(data)){return true;}current = current.Next;}return false;}/// <summary>/// 更新第一個匹配的節點的值/// </summary>/// <param name="oldData">舊數據</param>/// <param name="newData">新數據</param>/// <returns>是否更新成功</returns>public bool Update(T oldData, T newData){SingleListNode<T>? node = FindNode(oldData);if (node == null) return false;node.Data = newData; // 直接修改節點的數據return true;}/// <summary>/// 輔助方法:查找指定數據的節點/// </summary>private SingleListNode<T>? FindNode(T data){SingleListNode<T>? current = head;while (current != null){if (current.Data != null && current.Data.Equals(data)){return current;}current = current.Next;}return null;}}/// <summary>/// 單向鏈表實現(字段版本)/// </summary>/// <typeparam name="T">泛型數據類型</typeparam>public class SingleLinkedList_Field<T> :ISingleLinkedList<T>{// 頭節點(私有字段)private ListNode_Field<T>? head;/// <summary>/// 在鏈表尾部添加新節點/// </summary>public void Add(T data){ListNode_Field<T> newNode = new ListNode_Field<T>(data);if (head == null){head = newNode;return;}// 遍歷鏈表找到最后一個節點ListNode_Field<T> current = head;while (current.next != null){current = current.next;}current.next = newNode; // 直接操作字段}/// <summary>/// 刪除第一個匹配的節點/// </summary>public bool Remove(T data){if (head == null) return false;// 處理頭節點匹配的情況if (head.data != null && head.data.Equals(data)){head = head.next; // 直接操作字段return true;}ListNode_Field<T> current = head;while (current.next != null){if (current.next.data != null && current.next.data.Equals(data)){current.next = current.next.next; // 直接操作字段return true;}current = current.next;}return false;}/// <summary>/// 查找節點是否存在/// </summary>public bool Contains(T data){ListNode_Field<T>? current = head;while (current != null){if (current.data != null && current.data.Equals(data)){return true;}current = current.next;}return false;}/// <summary>/// 更新第一個匹配的節點的值/// </summary>public bool Update(T oldData, T newData){ListNode_Field<T>? node = FindNode(oldData);if (node == null) return false;node.data = newData; // 直接操作字段return true;}/// <summary>/// 輔助方法:查找指定數據的節點/// </summary>private ListNode_Field<T>? FindNode(T data){ListNode_Field<T>? current = head;while (current != null){if (current.data != null && current.data.Equals(data)){return current;}current = current.next;}return null;}}
}

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

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

相關文章

RK3588 Buildroot 串口測試工具

RK3588 Buildroot串口測試工具(含代碼) 一、引言 1.1 目的 本文檔旨在指導開發人員能快速測試串口功能 1.2 適用范圍 本文檔適用于linux 系統串口測試。 二、開發環境準備 2.1 硬件環境 開發板:RK3588開發板,確保其串口硬件連接正常,具備電源供應、調試串口等基本硬…

HOJ PZ

https://docs.hdoi.cn/deploy 單體部署 請到~/hoj-deploy/standAlone的目錄下&#xff0c;即是與docker-compose.yml的文件同個目錄下&#xff0c;該目錄下有個叫hoj的文件夾&#xff0c;里面的文件夾介紹如下&#xff1a; hoj ├── file # 存儲了上傳的圖片、上傳的臨…

EtherCAT 的優點與缺點

EtherCAT&#xff08;以太網控制自動化技術&#xff09;是一種高性能的工業以太網協議&#xff0c;廣泛應用于實時自動化控制。以下是其核心優缺點分析&#xff1a; ?一、EtherCAT 的核心優點? 1. ?超低延遲 & 高實時性? ?原理?&#xff1a;采用"?Processing…

高并發多級緩存架構實現思路

目錄 1.整體架構 3.安裝環境 1.1 使用docket安裝redis 1.2 配置redis緩存鏈接&#xff1a; 1.3 使用redisTemplate實現 1.4 緩存注解優化 1.4.1 常用緩存注解簡紹 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 優化 2.安裝Ngin…

Qt QML實現Windows桌面顏色提取器

前言 實現一個簡單的小工具&#xff0c;使用Qt QML實現Windows桌面顏色提取器&#xff0c;實時顯示鼠標移動位置的顏色值&#xff0c;包括十六進制值和RGB值。該功能在實際應用中比較常見&#xff0c;比如截圖的時候&#xff0c;鼠標移動就會在鼠標位置實時顯示坐標和顏色值&a…

vue3+vite 多個環境配置

同一套代碼 再也不用在不同的環境里來回切換請求地址了 然后踩了一個坑 就是env的文件路徑是在當前項目下 不是在views內 因為公司項目需求只有dev和pro兩個環境 雖然我新增了3個 但是只在這兩個里面配置了 .env是可以配置一些公共配置的 目前需求來說不需要 所以我也懶得配了。…

AI賦能PLC(一):三菱FX-3U編程實戰初級篇

前言 在工業自動化領域&#xff0c;三菱PLC以其高可靠性、靈活性和廣泛的應用場景&#xff0c;成為眾多工程師的首選控制設備。然而&#xff0c;傳統的PLC編程往往需要深厚的專業知識和經驗積累&#xff0c;開發周期長且調試復雜。隨著人工智能技術的快速發展&#xff0c;利用…

XSS 跨站Cookie 盜取表單劫持網絡釣魚溯源分析項目平臺框架

漏洞原理&#xff1a;接受輸入數據&#xff0c;輸出顯示數據后解析執行 基礎類型&#xff1a;反射 ( 非持續 ) &#xff0c;存儲 ( 持續 ) &#xff0c; DOM-BASE 拓展類型&#xff1a; jquery &#xff0c; mxss &#xff0c; uxss &#xff0c; pdfxss &#xff0c; flashx…

鴻蒙應用(醫院診療系統)開發篇2·Axios網絡請求封裝全流程解析

一、項目初始化與環境準備 1. 創建鴻蒙工程 src/main/ets/ ├── api/ │ ├── api.ets # 接口聚合入口 │ ├── login.ets # 登錄模塊接口 │ └── request.ets # 網絡請求核心封裝 └── pages/ └── login.ets # 登錄頁面邏輯…

ADAS高級駕駛輔助系統詳細介紹

ADAS&#xff08;高級駕駛輔助系統&#xff09;核心模塊&#xff0c;通過 “監測→預警→干預” 三層邏輯提升行車安全。用戶選擇車輛時&#xff0c;可關注傳感器配置&#xff08;如是否標配毫米波雷達&#xff09;、功能覆蓋場景&#xff08;如 AEB 是否支持夜間行人&#xff…

Prometheus+Grafana+K8s構建監控告警系統

一、技術介紹 Prometheus、Grafana及K8S服務發現詳解 Prometheus簡介 Prometheus是一個開源的監控系統和時間序列數據庫&#xff0c;最初由SoundCloud開發&#xff0c;現已成為CNCF(云原生計算基金會)的畢業項目?。它專注于實時監控和告警&#xff0c;特別適合云原生和分布式…

MATLAB腳本實現了一個三自由度的通用航空運載器(CAV-H)的軌跡仿真,主要用于模擬升力體在不同飛行階段(初始滑翔段、滑翔段、下壓段)的運動軌跡

%升力體:通用航空運載器CAV-H %讀取數據1 升力系數 alpha = [10 15 20]; Ma = [3.5 5 8 10 15 20 23]; alpha1 = 10:0.1:20; Ma1 = 3.5:0.1:23; [Ma1, alpha1] = meshgrid(Ma1, alpha1); CL = readmatrix(simulation.xlsx, Sheet, Sheet1, Range, B2:H4); CL1 = interp2(…

Day09【基于jieba分詞和RNN實現的簡單中文分詞】

基于jieba分詞和RNN實現的中文分詞 目標數據準備主程序預測效果 目標 本文基于給定的中文詞表&#xff0c;將輸入的文本基于jieba分詞分割為若干個詞&#xff0c;詞的末尾對應的標簽為1&#xff0c;中間部分對應的標簽為0&#xff0c;同時將分詞后的單詞基于中文詞表做初步序列…

Linux-服務器添加審計日志功能

#查看audit軟件是否在運行(狀態為active而且為綠色表示已經在運行) systemctl start auditd #如果沒有在運行的話,查看是否被系統禁用 (audit為0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改為audit=1 #更新GRUB…

uniappx項目上架各手機平臺

前段時間用uniappx開發的App&#xff0c;領導要求要在各個主要手機平臺上上架了&#xff0c;本來不是我的任務&#xff0c;后來其他人沒有空交給我了&#xff0c;上架小白一枚&#xff0c;哭唧唧的自己研究吧&#xff0c;根據領導發的賬號密碼登錄各個平臺上架&#xff0c;花費…

第4次課 前綴和與差分 A

課堂學習 前綴和數組 前1個收購點&#xff1a;3箱 前2個收購點&#xff1a;325箱 前3個收購點&#xff1a;32510箱 以此類推… 數組a存儲10個收購點的箱數。 收購點編號從1~10&#xff0c;數組下標也從1開始使用。 下標0位置直接賦值0 #include<bits/stdc.h> using nam…

MySQL部分總結

mysql學習筆記&#xff0c;如有不足還請指出&#xff0c;謝謝。 外連接&#xff0c;內連接&#xff0c;全連接 外連接&#xff1a;左外、右外 內連接&#xff1a;自己和自己連接 全連接&#xff1a;左外連接右外鏈接 mysql unique字段 unique可以在數據庫層面避免插入相同…

Spring MVC 請求處理流程詳解

步驟1&#xff1a;用戶發起請求 所有請求首先被 DispatcherServlet&#xff08;前端控制器&#xff09;攔截&#xff0c;它是整個流程的入口。 DispatcherServlet 繼承自 HttpServlet&#xff0c;通過 web.xml 或 WebApplicationInitializer 配置映射路徑&#xff08;如 /&…

Vue 高級技巧深度解析

Vue 高級技巧深度解析 mindmaproot(Vue2高級技巧)組件通信EventBusprovide/inject$attrs/$listeners性能優化虛擬DOM優化函數式組件按需加載狀態管理Vuex模塊化持久化存儲嚴格模式高級指令自定義指令動態組件異步組件渲染控制作用域插槽渲染函數JSX支持一、組件通信的進階之道 …

2024年React最新高頻面試題及核心考點解析,涵蓋基礎、進階和新特性,助你高效備戰

以下是2024年React最新高頻面試題及核心考點解析&#xff0c;涵蓋基礎、進階和新特性&#xff0c;助你高效備戰&#xff1a; 一、基礎篇 React虛擬DOM原理及Diff算法優化策略 ? 必考點&#xff1a;虛擬DOM樹對比&#xff08;同級比較、Key的作用、組件類型判斷&#xff09; ?…