什麼是鏈表?鏈表與數組的區別?

來源:互聯網
上載者:User

鏈表的相關知識整理

什麼是鏈表

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

鏈表與數組的區別

  回憶下數組的概念 ,所謂數組,是相同資料類型的元素按一定順序排列的集合。根據概念我們可以知道數組在記憶體中連續,鏈表不連續;由於不同的儲存方式導致數組靜態分配記憶體,鏈表動態分配記憶體,數組元素在棧區,鏈表元素在堆區;由於數組在記憶體中連續,我們可以利用下標定位,時間複雜度為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. 尋找單鏈表的中間結點
  5. 從尾到頭列印單鏈表
  6. 已知兩個單鏈表pHead1 和pHead2 各自有序,把它們合并成一個鏈表依然有序
  7. 判斷一個單鏈表中是否有環
  8. 判斷兩個單鏈表是否相交
  9. 求兩個單鏈表相交的第一個節點
  10. 已知一個單鏈表中存在環,求進入環中的第一個節點
  11. 給出一單鏈表頭指標pHead和一節點指標pToBeDeleted,O(1)時間複雜度刪除節點pToBeDeleted

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

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.