php 实现 单链表

来源:互联网 发布:量化分析软件 编辑:程序博客网 时间:2024/06/03 12:26
  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. ?>