c# 數據結構 鏈表篇 有關單鏈表的一切

? ? ? ? 本人能力有限,本文僅作學習交流與參考,如有不足還請斧正

目錄

0.單鏈表好處

0.5.單鏈表分類

1.無虛擬頭節點情況

圖示:

代碼:

頭插/尾插

刪除

搜索

遍歷全部

測試代碼:

全部代碼

2.有尾指針情況

尾插

全部代碼

3.有虛擬頭節點情況

全部代碼

4.循環單鏈表

幾個特別說明的點

增加時 更新環結構

刪除時 刪的頭節點

非刪頭節點 注意遍歷終止條件

全部代碼


0.單鏈表好處

優點說明 / 場景
動態內存分配節點按需創建,無需預先指定固定大小,避免數組的空間浪費或溢出(如數據量不確定時)
高效增刪操作插入 / 刪除只需修改指針(平均?O(1)?時間復雜度),尤其適合頻繁增刪場景(如棧、隊列)
內存分散存儲節點可存儲在非連續內存中,適應碎片化內存,利用零散空間(對比數組需連續內存)
靈活動態長度長度可隨時增減,無需擴容 / 縮容(如動態緩沖區、鏈表隊列)
實現簡單輕量節點結構簡單(數據 + 指針),代碼易理解,適合入門學習及快速實現基礎數據結構
適合鏈式場景支持鏈表特有操作(反轉、合并、判環等),常用于哈希表拉鏈法、操作系統進程調度等

0.5.單鏈表分類

分類維度類型核心特點典型場景 / 優勢
頭節點無頭節點頭指針直接指向第一個數據節點,需處理頭節點邊界條件簡單場景,代碼稍繁瑣
有頭節點頭節點為虛擬節點,簡化插入 / 刪除操作通用場景,代碼更簡潔
循環非循環尾節點?next?為?null,遍歷有終點大多數基礎場景
循環尾節點?next?指向頭節點,形成環循環遍歷、約瑟夫環等問題
輔助指針無尾指針尾插需遍歷鏈表(\(O(n)\))尾插操作較少的場景
帶尾指針尾插直接通過尾指針操作(\(O(1)\))頻繁尾插的場景

? ? ? ? 下無特殊說明 皆為非循環單鏈表?

1.無虛擬頭節點情況

??????????????????????????????????請注意 無頭節點的意思是沒有虛擬頭節點

????????????????????????而下所說的headNdoe代表的是實際數據第一個節點??? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ??單鏈表 = 實際數據頭節點 + (節點 1 + 節點 2 + … + 節點 n)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 其中,每個節點的定義為:??????節點 = 數據 + 指向下一個節點的指針

圖示:

注意 因為寫c#的時候使用指針需要注意下列問題:

所以指向下一個節點的指針 定義為Node類 也就是Node本身

代碼:

class Node { public int value;public Node nextNode;public Node(int value, Node nextNode) {this.value = value;this.nextNode = nextNode;}
}

頭插/尾插

? ? ? ? ? ?頭插的精髓:每一次插入新node的時候 就把舊headNode作為nextNode,然后改變head的指向即可
????????

class LinkeList {public Node headNode;public LinkeList() {headNode = null;}//頭插: 新節點的next指向頭節點,然后將頭節點指向新節點public void AddToHead(int value) { //創建一個新節點 并把原來的頭節點放到后面去 這就是頭插法的精髓Node newNode = new Node(value, headNode);//將頭節點指向新節點headNode = newNode;}
}

? ? ? ? 尾插精髓:遍歷到最后一個節點 將該節點NextNode指向新Node

????????

public void AddToTail(int value) {//創建一個新節點Node newNode = new Node(value, null);//如果鏈表為空,則直接將新節點作為頭節點if (headNode == null)headNode = newNode;else { //遍歷到最后一個節點Node currentNode = headNode;while (currentNode.nextNode != null){ currentNode = currentNode.nextNode; }currentNode.nextNode = newNode;}
}

刪除

? ? ? ? 按值刪除:單值

? ? ? ? 精髓:刪除不是讓你真刪掉,而是將Node的指針置null 這樣gc的時候就自動回收了

????????找到需要刪除的節點的上一個節點,將其nextNode = 要刪除節點的下一個Node

????????

    //按值刪除public void RemoveForValue(int value) {//如果鏈表為空,則直接返回if (headNode == null)return;//如果頭節點就是要刪除的節點,則直接將頭節點指向目標的下一個節點//相當于斷開了原來的頭節點 使其無用if (headNode.value == value) {headNode =headNode.nextNode;return;}//遍歷鏈表 Node currentNode = headNode;while (currentNode!=null&&currentNode.nextNode != null){if (currentNode.nextNode.value != value)currentNode = currentNode.nextNode;elsecurrentNode.nextNode = currentNode.nextNode.nextNode;}}

? ? ? ? 按值刪除:刪除所有匹配到的重復值

 public void RemoveForValue(int value){// 1. 處理頭節點的所有重復值(用while循環替代if)while (headNode != null && headNode.value == value){headNode = headNode.nextNode; // 連續刪除頭節點中的重復值}// 2. 遍歷刪除中間和尾節點的重復值Node currentNode = headNode;while (currentNode != null){// 檢查當前節點的下一個節點是否是目標值(避免漏判尾節點)while (currentNode.nextNode != null && currentNode.nextNode.value == value){currentNode.nextNode = currentNode.nextNode.nextNode; // 刪除下一個節點(重復值)}currentNode = currentNode.nextNode; // 移動到下一個非重復值節點}}

? ? ? ? 按節點刪除 略?

? ? ? ? 這個你知道有這么回事就行了 一般不會用到 因為他在使用的時候需要聲明要刪除的Node 所以從用戶角度來看就不太友好 不建議使用

搜索

? ???????按值遍歷

? ? ? ? ????精髓:沒有精髓 遍歷按值打印即可

    public bool SerachValue(int value){if (headNode == null) { Console.WriteLine("鏈表為空 無法找到指定值"); return false; }Node currentNode = headNode;while (currentNode != null&& currentNode.nextNode != null){if (currentNode.value == value){Console.WriteLine("包含指定值" + value);return true;}else {currentNode = currentNode.nextNode;}}Console.WriteLine("鏈表內沒有指定值" + value);return false;}

遍歷全部

????????精髓:沒有精髓 遍歷按值打印即可

    public void PrintAllValue() {if (headNode == null) return;Node currentNode = headNode;while (currentNode!= null){Console.WriteLine(currentNode.value);currentNode = currentNode.nextNode;}}

測試代碼:

LinkeList linke = new LinkeList();
linke.AddToHead(2);
linke.AddToHead(1);
linke.AddToTail(3);
//1 2 3
linke.RemoveForValue(2);
//1 3
Console.WriteLine(linke.SerachValue(2));//false
Console.WriteLine(linke.SerachValue(1));//truelinke.PrintAllValue(); // 1 3

全部代碼


using System.Buffers;LinkeList linke = new LinkeList();
linke.AddToHead(2);
linke.AddToHead(1);
linke.AddToTail(3);
//1 2 3
linke.RemoveForValue(2);
//1 3
Console.WriteLine(linke.SerachValue(2));//false
Console.WriteLine(linke.SerachValue(1));//truelinke.PrintAllValue(); // 1 3/// <summary>
/// 鏈表節點應該包含 值 和 指針
/// </summary>
class Node { public int value;public Node nextNode;public Node(int value, Node newNode) {this.value = value;this.nextNode = newNode;}
}
class LinkeList {public Node headNode;public LinkeList() {headNode = null;}#region Add//頭插: 新節點的next指向頭節點,然后將頭節點指向新節點public void AddToHead(int value){//創建一個新節點 并把原來的頭節點放到后面去 這就是頭插法的精髓Node newNode = new Node(value, headNode);//將頭節點指向新節點headNode = newNode;}//尾插public void AddToTail(int value){//創建一個新節點Node newNode = new Node(value, null);//如果鏈表為空,則直接將新節點作為頭節點if (headNode == null)headNode = newNode;else{//遍歷到最后一個節點Node currentNode = headNode;while (currentNode.nextNode != null){ currentNode = currentNode.nextNode; }currentNode.nextNode = newNode;}}#endregion#region Remove//按值刪除public void RemoveForValue(int value) {//如果鏈表為空,則直接返回if (headNode == null)return;//如果頭節點就是要刪除的節點,則直接將頭節點指向目標的下一個節點//相當于斷開了原來的頭節點 使其無用if (headNode.value == value) {headNode =headNode.nextNode;return;}//遍歷鏈表 Node currentNode = headNode;while (currentNode!=null&&currentNode.nextNode != null){if (currentNode.nextNode.value != value)currentNode = currentNode.nextNode;elsecurrentNode.nextNode = currentNode.nextNode.nextNode;}}#endregion#region Searchpublic bool SerachValue(int value){if (headNode == null) { Console.WriteLine("鏈表為空 無法找到指定值"); return false; }Node currentNode = headNode;while (currentNode != null&& currentNode.nextNode != null){if (currentNode.value == value){Console.WriteLine("包含指定值" + value);return true;}else {currentNode = currentNode.nextNode;}}Console.WriteLine("鏈表內沒有指定值" + value);return false;}#endregion#region 遍歷打印public void PrintAllValue() {if (headNode == null) return;Node currentNode = headNode;while (currentNode!= null){Console.WriteLine(currentNode.value);currentNode = currentNode.nextNode;}}#endregion
}

2.有尾指針情況

? ? ? ? 這個的特別之處在于尾巴輔助的話 尾插不用遍歷到最后尾巴

? ? ? ? 初始化的時候需要注意一下

尾插

class LinkeList
{public Node headNode;public Node tailNode;public LinkeList(){headNode = tailNode = null;}
}
    // 尾插public void AddToTail(int value){Node newNode = new Node(value);if (headNode == null)headNode = tailNode = newNode;tailNode.nextNode = newNode;tailNode = newNode;}

? ? ? ? ?其他的就沒什么了和無虛擬頭節點的代碼和方法幾乎是一樣的

全部代碼


using System.Diagnostics;LinkeList linkeList = new LinkeList();
linkeList.AddToHead(2);
linkeList.AddToHead(1);
linkeList.AddToTail(3);
linkeList.RemoveForValue(3);
linkeList.SerachValue(2);
linkeList.SerachValue(3);
linkeList.PrintAllValue();
class Node
{public int value;public Node nextNode;public Node(int value, Node newNode = null){this.value = value;this.nextNode = newNode;}
}class LinkeList
{public Node headNode;public Node tailNode;public LinkeList(){headNode = tailNode = null;}#region Add// 頭插public void AddToHead(int value){Node newNode = new Node(value,headNode);if (headNode == null) headNode = tailNode = newNode;headNode = newNode;}// 尾插public void AddToTail(int value){Node newNode = new Node(value);if (headNode == null)headNode = tailNode = newNode;if(tailNode!= null)tailNode.nextNode = newNode;elsetailNode = newNode;}#endregion#region Remove// 按值刪除:雙向查找 刪除第一個找到的值public void RemoveForValue(int value){//頭空 直接返回if (headNode == null)return;//只有一個頭if (headNode.value == value){if (headNode.nextNode == null)headNode = tailNode = null;return;}Node currentNode = headNode;while (currentNode!=null && currentNode.nextNode != null){//如果下一個節點的值等于要刪除的值if (currentNode.nextNode.value == value) {//在尾巴上 就更新尾巴if (currentNode.nextNode == tailNode){tailNode = currentNode;}//不在尾巴上 就干掉下一個節點currentNode.nextNode = currentNode.nextNode.nextNode;}elsecurrentNode = currentNode.nextNode;}}#endregion#region Searchpublic bool SerachValue(int value){if (headNode == null)return false;Node currentNode = headNode;while (currentNode != null && currentNode.nextNode != null){//如果下一個節點的值等于要刪除的值if (currentNode.nextNode.value == value){Console.WriteLine("找到了目標值"+value);return true;}elsecurrentNode = currentNode.nextNode;}Console.WriteLine("沒找到了目標值" + value);return false; }#endregion#region 遍歷打印public void PrintAllValue(){Node currentNode = headNode;while (currentNode != null){Console.WriteLine(currentNode.value);currentNode = currentNode.nextNode;}}#endregion
}

3.有虛擬頭節點情況

????????我認為其沒有什么特別的含義 只是省去了頭節點為null的判斷 我截圖對比一下

左無頭 右有頭

全部代碼

using System;
LinkeList linke = new LinkeList();
linke.AddToHead(2);
linke.AddToHead(1);
linke.AddToTail(3);
// 1 2 3
linke.RemoveForValue(2);
// 1 3
Console.WriteLine(linke.SerachValue(2));// false
Console.WriteLine(linke.SerachValue(1));// truelinke.PrintAllValue(); // 1 3
/// <summary>
/// 鏈表節點應該包含 值 和 指針
/// </summary>
class Node
{public int value;public Node nextNode;public Node(int value, Node newNode = null){this.value = value;this.nextNode = newNode;}
}class LinkeList
{// 虛擬頭節點private Node dummyHead;public LinkeList(){// 初始化虛擬頭節點dummyHead = new Node(0);}#region Add// 頭插: 新節點的next指向虛擬頭節點的下一個節點,然后將虛擬頭節點的next指向新節點public void AddToHead(int value){Node newNode = new Node(value, dummyHead.nextNode);dummyHead.nextNode = newNode;}// 尾插public void AddToTail(int value){Node newNode = new Node(value);Node currentNode = dummyHead;while (currentNode.nextNode != null){currentNode = currentNode.nextNode;}currentNode.nextNode = newNode;}#endregion#region Remove// 按值刪除public void RemoveForValue(int value){Node currentNode = dummyHead;while (currentNode != null && currentNode.nextNode != null){if (currentNode.nextNode.value == value){currentNode.nextNode = currentNode.nextNode.nextNode;}else{currentNode = currentNode.nextNode;}}}#endregion#region Searchpublic bool SerachValue(int value){Node currentNode = dummyHead.nextNode;while (currentNode != null){if (currentNode.value == value){Console.WriteLine("包含指定值" + value);return true;}currentNode = currentNode.nextNode;}Console.WriteLine("鏈表內沒有指定值" + value);return false;}#endregion#region 遍歷打印public void PrintAllValue(){Node currentNode = dummyHead.nextNode;while (currentNode != null){Console.WriteLine(currentNode.value);currentNode = currentNode.nextNode;}}#endregion
}

4.循環單鏈表

? ? ? ? 我直接用情況2?的代碼改的 核心在于:

  1. 尾節點的?nextNode?指向頭節點(形成環)
  2. 遍歷 / 搜索時通過頭節點判斷終止條件(避免死循環)
  3. 維護頭尾指針的環結構一致性

? ? ? ? 你要是問都循環了 還區分頭尾節點有必要嗎?

? ? ? ? 有的兄弟,有的 這樣頭尾插都是O1

幾個特別說明的點

增加時 更新環結構

   // 尾插法:新節點的next指向頭節點,原尾節點的next指向新節點,更新尾節點public void AddToTail(int value){Node newNode = new Node(value, headNode); // 新節點的next指向頭節點(形成環)if (tailNode == null){// 空鏈表:頭尾節點指向新節點,自環headNode = tailNode = newNode;newNode.nextNode = newNode;}else{tailNode.nextNode = newNode; // 原尾節點連接新節點tailNode = newNode; // 尾節點更新為新節點}}

刪除時 刪的頭節點

 public void RemoveForValue(int value){if (headNode == null) return;// 情況1:刪除頭節點if (headNode.value == value){if (headNode == tailNode) // 只有一個節點{headNode = tailNode = null; // 環斷開}else // 多個節點,頭節點后移,尾節點的next指向新頭節點{headNode = headNode.nextNode;tailNode.nextNode = headNode; // 尾節點保持環結構}return;}.................}

非刪頭節點 注意遍歷終止條件

 while (previous.nextNode != headNode){if (previous.nextNode.value == value){Node target = previous.nextNode;if (target == tailNode){tailNode = previous;tailNode.nextNode = headNode;}else{previous.nextNode = target.nextNode;}}else{previous = previous.nextNode;}}

全部代碼

class Node
{public int value;public Node nextNode;public Node(int value, Node nextNode = null){this.value = value;this.nextNode = nextNode;}
}class CircularLinkedList
{public Node headNode;public Node tailNode;public CircularLinkedList(){headNode = tailNode = null;}// 頭插法public void AddToHead(int value){Node newNode = new Node(value, headNode);if (headNode == null){headNode = tailNode = newNode;newNode.nextNode = newNode;}else{tailNode.nextNode = newNode;headNode = newNode;}}// 按值刪除節點public void RemoveForValue(int value){if (headNode == null) return;// 處理頭節點是要刪除的值的情況while (headNode != null && headNode.value == value){if (headNode == tailNode){headNode = tailNode = null;return;}headNode = headNode.nextNode;tailNode.nextNode = headNode;}Node previous = headNode;while (previous.nextNode != headNode){if (previous.nextNode.value == value){Node target = previous.nextNode;if (target == tailNode){tailNode = previous;tailNode.nextNode = headNode;}else{previous.nextNode = target.nextNode;}}else{previous = previous.nextNode;}}}// 遍歷打印鏈表public void PrintAllValue(){if (headNode == null) return;Node current = headNode;do{Console.WriteLine(current.value);current = current.nextNode;} while (current != headNode);}
}

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

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

相關文章

藍橋杯C++組算法知識點整理 · 考前突擊(上)【小白適用】

【背景說明】本文的作者是一名算法競賽小白&#xff0c;在第一次參加藍橋杯之前希望整理一下自己會了哪些算法&#xff0c;于是有了本文的誕生。分享在這里也希望與眾多學子共勉。如果時間允許的話&#xff0c;這一系列會分為上中下三部分和大家見面&#xff0c;祝大家競賽順利…

pipe匿名管道實操(Linux)

管道相關函數 1 pipe 是 Unix/Linux 系統中的一個系統調用&#xff0c;用于創建一個匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 參數說明&#xff1a; pipefd[2]&#xff1a;一個包含兩個整數的數組&#xff0c;用于存儲管道的文件描述符&#xff1a; pi…

centos-stream-9上安裝nvidia驅動和cuda-toolkit

這里寫目錄標題 驅動安裝1. 更新系統2. NVIDIA GPU安裝檢查系統是否安裝了 NVIDIA GPU2.1 首先&#xff0c;使用以下命令更新 DNF 軟件包存儲庫緩存&#xff1a;2.2 安裝編譯 NVIDIA 內核模塊所需的依賴項和構建工具2.3 在 CentOS Stream 9 上添加官方 NVIDIA CUDA 軟件包存儲庫…

LDAP高效數據同步:Syncrepl復制模式實戰指南

#作者&#xff1a;朱雷 文章目錄 一、Syncrepl 復制簡介1.1. 什么是復制模式1.2. 什么是 syncrepl同步復制 二、Ldap環境部署三、配置復制類型3.1. 提供者端配置3.2. 消費者端配置3.3.啟動服務3.4.測試同步是否生效 四、總結 一、Syncrepl 復制簡介 1.1. 什么是復制模式 Ope…

Linux 內核網絡協議棧中的 struct packet_type:以 ip_packet_type 為例

在 Linux 內核的網絡協議棧中,struct packet_type 是一個核心數據結構,用于注冊特定協議類型的數據包處理邏輯。它定義了如何處理特定協議的數據包,并通過協議類型匹配機制實現協議分發。本文將通過分析 ip_packet_type 的定義和作用,深入探討其在網絡協議棧中的重要性。 …

QT Sqlite數據庫-教程001 創建數據庫和表-下

【1】創建帶名稱的數據庫 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader…

Cannot find module ‘vue‘ or its corresponding type declarations

在使用vue3vite創建新的工程時&#xff0c;在新增.vue文件時會出現Cannot find module vue這個錯誤。 只需要我們在項目中的.d.ts文件中添加以下代碼即可 declare module *.vue {import { defineComponent } from vue;const component: ReturnType<typeof defineComponent&…

SSRF打靶總結

文章目錄 一. PortSwigger1、本地服務器的基本SSRF2、基本的目標不是漏洞機3、Referer標頭的外帶SSRF4、簡單黑名單的SSRF黑名單繞過思路&#xff1a; 5、重定向的SSRF6. 簡單的白名單SSRF白名單繞過思路&#xff1a; 二、BWAPP1. SSRF 文件包含漏洞 | 內網探測2. XXE -> S…

STL-函數對象

1.函數對象 1.1 概念 重載函數調用操作符的類&#xff0c;其對象被稱為函數對象 函數對象使用重載的&#xff08;&#xff09;時&#xff0c;行為類似函數調用&#xff0c;也成為仿函數 本質&#xff1a;函數對象&#xff08;仿函數&#xff09;是一個類&#xff0c;不是一…

多線程(Java)

注&#xff1a;本文為本人學習過程中的筆記 1.導入 1.進程和線程 我們希望我們的程序可以并發執行以提升效率&#xff0c;此時引入了多進程編程。可是創建進程等操作開銷太大&#xff0c;于是就將進程進一步拆分成線程&#xff0c;減少開銷。進程與進程之間所涉及到的資源是…

在 Dev-C++中編譯運行GUI 程序介紹(三)有趣示例一組

在 Dev-C中編譯運行GUI程序介紹&#xff08;三&#xff09;有趣示例一組 前期見 在 Dev-C中編譯運行GUI 程序介紹&#xff08;一&#xff09;基礎 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中編譯運行GUI 程序介紹&#xff08;二&#xff09;示例&a…

【高校主辦】2025年第四屆信息與通信工程國際會議(JCICE 2025)

重要信息 會議網址&#xff1a;www.jcice.org 會議時間&#xff1a;2025年7月25-27日 召開地點&#xff1a;哈爾濱 截稿時間&#xff1a;2025年6月15日 錄用通知&#xff1a;投稿后2周內 收錄檢索&#xff1a;EI,Scopus 會議簡介 JCICE 2022、JCICE 2023、JCICE 2…

【Linux】Linux 操作系統 - 03 ,初步指令結尾 + shell 理解

文章目錄 前言一、打包和壓縮二、有關體系結構 (考)面試題 三、重要的熱鍵四、shell 命令及運行原理初步理解五、本節命令總結總結 前言 本篇文章 , 筆者記錄的筆記內容包含 : 基礎指令 、重要熱鍵 、shell 初步理解 、權限用戶的部分問題 。 內容皆是重要知識點 , 需要認真理…

Python: sqlite3.OperationalError: no such table: ***解析

出現該錯誤說明數據庫中沒有成功創建 reviews 表。以下是完整的解決方案: 步驟 1:創建數據庫表 在插入數據前,必須先執行建表語句。請通過以下任一方式創建表: 方式一:使用 SQLite 命令行 bash 復制 # 進入 SQLite 命令行 sqlite3 reviews.db# 執行建表語句 CREATE T…

VSCode CLine 插件自定義配置使用 Claude 3.7 模型進行 AI 開發

一個互聯網技術玩家&#xff0c;一個愛聊技術的家伙。在工作和學習中不斷思考&#xff0c;把這些思考總結出來&#xff0c;并分享&#xff0c;和大家一起交流進步。 本文介紹如何在 Visual Studio Code (VSCode) 中安裝和自定義配置 CLine 插件&#xff0c;并使用 Claude 3.7 模…

【VSCode配置】運行springboot項目和vue項目

目錄 安裝VSCode安裝軟件安裝插件VSCode配置user的全局設置setting.jsonworkshop的項目自定義設置setting.jsonworkshop的項目啟動配置launch.json 安裝VSCode 官網下載 安裝軟件 git安裝1.1.12版本&#xff0c;1.2.X高版本無法安裝node14以下版本 nvm安裝&#xff08;github…

linux shell編程之條件語句(二)

目錄 一. 條件測試操作 1. 文件測試 2. 整數值比較 3. 字符串比較 4. 邏輯測試 二. if 條件語句 1. if 語句的結構 (1) 單分支 if 語句 (2) 雙分支 if 語句 (3) 多分支 if 語句 2. if 語句應用示例 (1) 單分支 if 語句應用 (2) 雙分支 if 語句應用 (3) 多分支 …

榕壹云在線商城系統:基于THinkPHP+ Mysql+UniApp全端適配、高效部署的電商解決方案

項目背景&#xff1a;解決多端電商開發的痛點 隨著移動互聯網的普及和用戶購物習慣的碎片化&#xff0c;傳統電商系統面臨以下挑戰&#xff1a; 1. 多平臺適配成本高&#xff1a;需要同時開發App、小程序、H5等多端應用&#xff0c;重復開發導致資源浪費。 2. 技術依賴第三方…

神經動力學系統與計算及AI拓展

大腦&#xff0c;一個蘊藏在我們顱骨之內的宇宙&#xff0c;以活動脈動&#xff0c;如同由電信號和化學信號編織而成的交響樂&#xff0c;精巧地協調著思想、情感和行為。但是&#xff0c;這種復雜的神經元舞蹈是如何產生我們豐富多彩的精神生活的呢&#xff1f;這正是神經動力…

K8s常用基礎管理命令(一)

基礎管理命令 基礎命令kubectl get命令kubectl create命令kubectl apply命令kubectl delete命令kubectl describe命令kubectl explain命令kubectl run命令kubectl cp命令kubectl edit命令kubectl logs命令kubectl exec命令kubectl port-forward命令kubectl patch命令 集群管理命…