搜尋
首頁後端開發C#.Net教程什麼是鍊錶?鍊錶與數組的差別?

什麼是鍊錶?鍊錶與數組的差別?

Jun 24, 2017 am 09:50 AM
整理相關知識

鍊錶的相關知識整理

什麼是鍊錶

  鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是透過鍊錶中的指針連結次序實現的。鍊錶由一系列結點(鍊錶中每一個元素稱為結點)組成,結點可以在運行時動態產生。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點位址的指標域。

鍊錶與陣列的差異

  回憶下陣列的概念 ,所謂數組,是相同資料型別的元素按一定順序排列的集合。根據概念我們可以知道數組在內存中連續,鍊錶不連續;由於不同的存儲方式導致數組靜態分配內存,鍊錶動態分配內存,數組元素在棧區,鍊錶元素在堆區;由於數組在內存中連續,我們可以利用下標定位,時間複雜度為O(1),鍊錶定位元素時間複雜度O(n);但是由於數組的連續性數組插入或刪除元素的時間複雜度O(n),鍊錶的時間複雜度O(1)。總結一下,數組和鍊錶的區別如下
  1.數組靜態分配內存,鍊錶動態分配內存
  2.數組在內存中連續,鍊錶不連續
  3.數組元素在棧區,鍊錶元素在堆區
  4.數組利用下標定位,時間複雜度為O(1),鍊錶定位元素時間複雜度O(n);
  5.數組插入或刪除元素的時間複雜度O( n),鍊錶的時間複雜度O(1)。

C#實現鍊錶的基本操作

  以單鍊錶為例,根據鍊錶的定義我們先定義鍊錶節點的資料結構

    public class Node<T>
    {
        private T data;
        private Node<T> next;

        //有参构造函数
        //主要用例实例化需要处理的节点用
        public Node(T item, Node<T> next)
        {
            data = item;
            this.next = next;
        }

        //无参构造函数,用例实例化Node节点
        public Node()
        {
            data = default(T);
            next = null;
        }

        public Node<T> Next
        {
            get { return next; }
            set { this.next = value; }
        }

        public T Data
        {
            get { return data; }
            set { this.data = value; }
        }
    }

  接下來我們來實現鍊錶的操作,建構一個鍊錶,在構造鍊錶裡我們定一個頭結點的對象,頭結點是個很有用的節點,在後續程式碼中就可以慢慢體會到

    public class MyLinkList<T>
    {
       public Node<T> Head { get; set; }

        //构造器  
        public MyLinkList()
        {
            Head = null;
        }
    }

   1.求鍊錶的長度,思維:從頭結點向後訪問,直到最後一個節點,代碼如下

       public int Length()
        {
            var p = Head;
            int len = 0;
            while (p != null)
            {
                ++len;
                p = p.Next;
            }
            return len;
        }

#   2.清空鍊錶,這個就比較奧簡單了,直接將頭結點置為null 即可,程式碼如下

        public void Clear()
        {
            Head = null;
        }

   3.同理判斷鍊錶是否為空也要用的頭結點

        public bool IsEmpty()
        {
            if (Head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

   4.在鍊錶的末端新增元素,新增元素,需要先判斷鍊錶是否為空,如果為空我們要給頭結點賦值,如果不為空需要修改最後一個節點的next指向,程式碼如下

       public void Append(T item)
        {

            if (Head == null)
            {
                Head = new Node<T>(item, null);
                return;
            }
            var p = new Node<T>();
            p = Head;
            while (p.Next != null)
            {
                p = p.Next;
            }
            p.Next = new Node<T>(item, null);
        }

   5.在單鍊錶的第i個結點的位置前插入一個指定結點,首先需要找到插入的位置,然後修改相鄰節點的指向即可, 程式碼如下

        public void Insert(T item, int i)
        {

            if (IsEmpty() || i < 1 || i > GetLength())
            {
                return;
            }
            //如果在第一个位置插入 则只需要将该节点的next 指向head即可
            if (i == 1)
            {
                var first = new Node<T>(item, null);
                first.Next = Head;
                Head = first;
                return;
            }

            var p = new Node<T>();
            p = Head;
            var left = new Node<T>();
            var right = new Node<T>();
            int j = 1;
            while (p.Next != null && j < i)
            {
                left = p;
                right = p.Next;
                ++j;
            }
            var q = new Node<T>(item, null);
            left.Next = q;
            q.Next = right;
        }

   6.刪除指定節點,先找到要刪除的前一個結點,然後修改該結點的next指向即可  程式碼略。 。 。 。

·  7.鍊錶還有刪除、獲取、查找等操作,基本思想都是一樣的,就不一一介紹了

鍊錶相關的經典題目

# 1. 求單鍊錶中結點的個數
  2. 將單鍊錶反轉
  3. 找出單鍊錶中的倒數第K個結點(k > 0)
  4. 找出單鍊錶中的倒數第K個結點(k >0)
  4.鍊錶的中間結點
  5. 從尾到頭列印單鍊錶
  6. 已知兩個單鍊錶pHead1 和pHead2 各自有序,把它們合併成一個鍊錶依然有序
  7.判斷一個單鍊錶中是否有環
  8. 判斷兩個單鍊錶是否相交
  9. 求兩個單鍊錶相交的第一個節點
  10. 已知一個單鍊錶中存在環,求進入環中的第一個節點

  11. 給出一單鍊錶頭指標pHead和一節點指標pToBeDeleted,O(1)時間複雜度刪除節點pToBeDeleted

 

好了就擼到這裡,題目是劍指offer裡的題目,大家可以解答下,有問題聯絡我

  

 ###

以上是什麼是鍊錶?鍊錶與數組的差別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
C#作為多功能.NET語言:應用程序和示例C#作為多功能.NET語言:應用程序和示例Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

C#.NET用於網絡,桌面和移動開發C#.NET用於網絡,桌面和移動開發Apr 25, 2025 am 12:01 AM

C#和.NET適用於Web、桌面和移動開發。 1)在Web開發中,ASP.NETCore支持跨平台開發。 2)桌面開發使用WPF和WinForms,適用於不同需求。 3)移動開發通過Xamarin實現跨平台應用。

C#.NET生態系統:框架,庫和工具C#.NET生態系統:框架,庫和工具Apr 24, 2025 am 12:02 AM

C#.NET生態系統提供了豐富的框架和庫,幫助開發者高效構建應用。 1.ASP.NETCore用於構建高性能Web應用,2.EntityFrameworkCore用於數據庫操作。通過理解這些工具的使用和最佳實踐,開發者可以提高應用的質量和性能。

將C#.NET應用程序部署到Azure/AWS:逐步指南將C#.NET應用程序部署到Azure/AWS:逐步指南Apr 23, 2025 am 12:06 AM

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#.NET:強大的編程語言簡介C#.NET:強大的編程語言簡介Apr 22, 2025 am 12:04 AM

C#和.NET的結合為開發者提供了強大的編程環境。 1)C#支持多態性和異步編程,2).NET提供跨平台能力和並發處理機制,這使得它們在桌面、Web和移動應用開發中廣泛應用。

.NET框架與C#:解碼術語.NET框架與C#:解碼術語Apr 21, 2025 am 12:05 AM

.NETFramework是一個軟件框架,C#是一種編程語言。 1..NETFramework提供庫和服務,支持桌面、Web和移動應用開發。 2.C#設計用於.NETFramework,支持現代編程功能。 3..NETFramework通過CLR管理代碼執行,C#代碼編譯成IL後由CLR運行。 4.使用.NETFramework可快速開發應用,C#提供如LINQ的高級功能。 5.常見錯誤包括類型轉換和異步編程死鎖,調試需用VisualStudio工具。

揭開c#.net的神秘面紗:初學者的概述揭開c#.net的神秘面紗:初學者的概述Apr 20, 2025 am 12:11 AM

C#是一種由微軟開發的現代、面向對象的編程語言,.NET是微軟提供的開發框架。 C#結合了C 的性能和Java的簡潔性,適用於構建各種應用程序。 .NET框架支持多種語言,提供垃圾回收機制,簡化內存管理。

C#和.NET運行時:它們如何一起工作C#和.NET運行時:它們如何一起工作Apr 19, 2025 am 12:04 AM

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。