php 實現 單鏈表

來源:互聯網
上載者:User
  1. <?php 
  2. class LinkList   
  3. {  
  4.      
  5.    protected  $linkList  =array();  
  6.    protected  $listLength=0;  
  7.    protected  $listHeader=null;  
  8.    protected  $existedCounts=0;  
  9.      
  10.    public function __construct($arr='')  
  11.    {  
  12.      $arr!=null&&$this->createList($arr);  
  13.    }  
  14.      
  15.   public function createList($arr)  
  16.   {   
  17.    if (!is_array($arr))   
  18.     return false;  
  19.    $length=count($arr);  
  20.    for($i=0;$i<$length;$i++)  
  21.    {     
  22.        if($i==$length-1)  
  23.        {  
  24.         //每個鏈表結點包括var和next兩個索引,var表示結點值,next為下一個結點的索引  
  25.         //最後一個結點的next為null  
  26.         $list[$i]['var']  =$arr[$i];  
  27.         $list[$i]['next'] =null;  
  28.        }  
  29.        else   
  30.        {  
  31.         $list[$i]['var']  =$arr[$i];  
  32.         $list[$i]['next'] =$i+1;  
  33.        }  
  34.    }  
  35.    $this->linkList      =$list;  
  36.    $this->listLength    =$length;  
  37.    $this->existedCounts =$length;  
  38.    $this->listHeader=0;  
  39.    return true;  
  40.   }  
  41.     
  42.   public function returnToArray()  
  43.   {   
  44.    $arr=array();  
  45.    $tmp=$this->linkList[$this->listHeader];  
  46.     for($i=0;$i<$this->listLength;$i++)  
  47.    {  
  48.      $arr[]=$tmp['var'];  
  49.      if ($i!=$this->listLength-1)   
  50.      {  
  51.      $tmp=$this->linkList[$tmp['next']];  
  52.      }  
  53.    }  
  54.    return $arr;  
  55.   }  
  56. public function getLength()  
  57.   {  
  58.           return $this->listLength;  
  59.   }  
  60.     
  61.   public function getDeletedNums()  
  62.   {  
  63.           $count=$this->existedCounts-$this->listLength;  
  64.           return $count;  
  65.   }  
  66.     
  67.   public function getElemLocation($index)  
  68.   {  
  69.   if (!array_key_exists($index,$this->linkList))   
  70.    return false;  
  71.     $arrIndex=$this->listHeader;  
  72.     for($num=1;$tmp=$this->linkList[$arrIndex];$num++)  
  73.     {  
  74.             if ($index==$arrIndex)   
  75.             break;  
  76.             else   
  77.             {  
  78.                     $arrIndex=$tmp['next'];  
  79.             }  
  80.     }  
  81.     return $num;  
  82.   }  
  83.     
  84.   protected function &getElemRef($i)  
  85.   {  
  86.           //判斷$i的類型以及是否越界  
  87.           $result=false;  
  88.           if (!is_numeric($i)||(int)$i<=0||(int)$i>$this->listLength)   
  89.           return $result;  
  90.    //由於單鏈表中的任何兩個元素的儲存位置之間沒有固定關係,要取得第i個元素必須從  
  91.    //表頭開始尋找,因此單鏈表是非隨機儲存的儲存結構。  
  92.    $j=0;  
  93.    $value=&$this->linkList[$this->listHeader];  
  94.    while ($j<$i-1)  
  95.    {  
  96.            $value=&$this->linkList[$value['next']];  
  97.            $j++;  
  98.    }  
  99.    return $value;  
  100.   }  
  101.     
  102.   public function getElemvar($i)  
  103.   {  
  104.     $var=$this->getElemRef($i);  
  105.     if ($var!=false)   
  106.     {  
  107.             return $var['var'];  
  108.     }  
  109.     else return false;  
  110.   }  
  111.     
  112.   public function insertIntoList($i,$var)  
  113.   {  
  114.           if (!is_numeric($i)||(int)$i<0||(int)$i>$this->listLength)   
  115.           return false;  
  116.           if ($i==0)   
  117.           {  
  118.           //如果$i-0,則在表最前面添加元素,新元素索引為$listLength,這樣是確保不會  
  119.           //覆蓋原來的元素,另外這種情況需要重新設定$listHeader  
  120.               $this->linkList[$this->existedCounts]['var'] =$var;  
  121.               $this->linkList[$this->existedCounts]['next']=$this->listHeader;  
  122.               $this->listHeader=$this->existedCounts;  
  123.               $this->listLength++;  
  124.               $this->existedCounts++;  
  125.               return true;          
  126.           }  
  127.    $value=&$this->getElemRef($i);  
  128.    $this->linkList[$this->existedCounts]['var'] =$var;  
  129.    $this->linkList[$this->existedCounts]['next']=($i==$this->listLength?null:$value['next']);  
  130.    $value['next']=$this->existedCounts;  
  131.    $this->listLength++;  
  132.    $this->existedCounts++;  
  133.    return true;  
  134.   }  
  135.     
  136.   public function delFromList($i)  
  137.   {  
  138.           if (!is_numeric($i)||(int)$i<=0||(int)$i>$this->listLength)   
  139.           return false;  
  140.     if ($i==1)   
  141.     {  
  142.     //若刪除的結點為頭結點,則需要從新設定鏈表頭  
  143.       $tmp=$this->linkList[$this->listHeader];  
  144.       unset($this->linkList[$this->listHeader]);  
  145.       $this->listHeader=$tmp['next'];  
  146.       $this->listLength--;  
  147.       return true;  
  148.     }  
  149.     else   
  150.     {  
  151.      $value    =&$this->getElemRef($i);  
  152.      $prevValue=&$this->getElemRef($i-1);  
  153.      unset($this->linkList[$prevValue['next']]);  
  154.      $prevValue['next']=$value['next'];  
  155.      $this->listLength--;  
  156.      return true;  
  157.     }  
  158.   }  
  159.  
  160. public function listSort($sortType='true')  
  161. {  
  162.    //從新修改關聯關係可能會更複雜,所以我選擇先還原成一維數組,然後對數組排序,然後再產生鏈表  
  163.    $arr=$this->returnToArray();  
  164.    $sortType?sort($arr):rsort($arr);  
  165.    $this->createList($arr);  
  166. }  
  167. }  
  168. ?>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.