作用:是隨機存儲,查找必須順序引導查找,優點是增加新節點和刪除節點方便,缺點是不能直接讀取數據
要點:鏈表是一種常見的重要的數據結構。它是動態地進行存儲分配的一種結構。它可以根據需要開辟內存單元(避免內存的浪費)
鏈表無非是幾種固定形式:單向的,雙向的,循環的,帶或不帶頭節點的,帶或不帶尾節點的,熟悉一種結構,其它的類推
數組是將元素在內存中連續存放,由于每個元素占用內存相同,可以通過下標迅速訪問數組中任何元素。但是如果要在數組中增加一個元素,需要移動大量元素,在內存中空出一個元素的空間,然后將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素。如果應用需要快速訪問數據,很少或不插入和刪除元素,就應該用數組。
鏈表恰好相反,鏈表中的元素在內存中不是順序存儲的,而是通過存在元素中的指針聯系到一起。比如:上一個元素有個指針指到下一個元素,以此類推,直到最后一個元素。如果要訪問鏈表中一個元素,需要從第一個元素開始,一直找到需要的元素位置。但是增加和刪除一個元素對于鏈表數據結構就非常簡單了,只要修改元素中的指針就可以了。如果應用需要經常插入和刪除元素你就需要用鏈表數據結構了。
★雙向鏈表和單向鏈表的區別
①單向鏈表內存占用比雙向的少②在查找一個前節點,雙向比單向快,因為單向鏈表的話,你必須從頭節點開始遍歷,而雙向鏈表的節點中本身就有前節點信息
④單向鏈表存儲結構的節點中只有一個指向后繼節點的指針;⑤雙向鏈表的節點中有兩個指針,其中一個后繼節點的指針,另一個指向前一個節點的指針。
一、單鏈表
鏈表:是一個有序的列表,但是它在內存中是分散存儲的,使用鏈表可以解決類似約瑟夫問題,排序問題,搜索問題,廣義表
單向鏈表,雙向鏈表,環形鏈表
PHP的底層是C,當一個程序運行時,內存分成五個區(堆區,棧區,全局區,常量區,代碼區)
規定:基本數據類型,一般放在棧區
復合數據類型,比如對象,放在堆區
定義一個類Hero
定義成員屬性排名 $no
定義成員屬性姓名 $name
定義成員屬性昵稱 $nickname
定義成員屬性 $next,是一個引用,指向下一個Hero對象
定義構造函數,傳遞參數:$no,$name,$nickname
創建一個頭head,該head只是一個頭,不放入數據
獲取$head對象,new Hero()
獲取第一個Hero對象$hero,new Hero(1,”宋江”,”及時雨”)
連接兩個對象,$head->next=$hero
獲取第二個Hero對象$hero2,new Hero(2,”盧俊義”,”玉麒麟”)
連接兩個對象,$hero->next=$hero2
遍歷鏈表
定義一個函數showHeros(),參數:$head對象
定義一個臨時變量$cur來存儲$head對象
while循環,條件$cur->next不為null
打印一下
指針后移,$cur=$cur->next
<?php/*** 英雄類*/class Hero{ public $no; public $name; public $nickname; public $next=null; public function __construct($no='',$name='',$nickname=''){ $this->no=$no; $this->name=$name; $this->nickname=$nickname; }}class LinkListDemo{ public static function main(){ $head=new Hero(); $hero1=new Hero(1,"宋江","及時雨"); $head->next=$hero1; $hero2=new Hero(2,"盧俊義","玉麒麟"); $hero1->next=$hero2; LinkListDemo::showHeros($head); } /** * 展示英雄 */ public static function showHeros($head){ $cur=$head; while($cur->next!=null){ echo "姓名:".$cur->next->name."<br/>"; $cur=$cur->next; } } } LinkListDemo::main();
新聞熱點
疑難解答
圖片精選