我们今天为大家带来的时候如何运用php数组实现单链表结构
此类主要是依靠php强大的数组系统来模拟出单链表类型的数据结构。 本人完全凭借自己的 兴趣来编写此类,并未考虑其实用性,主要是给大家理解一些简单的数据结构知识,同时也训练 一下php中的数组运用能力。
单链表简介:
单链表是最简单的链表表示。用它来表示线性表时,每一个数据元素占用一个结点(node)。一个 结点一般由两个域组成,一个域存放数据元素data; 另一个域存放一个指向链表中下一个结点的指针link,它指出下一个结点 的开始存储地址。而最后一个结点的指针为空。单链表中数据元素之间的逻 辑关系是由结点中的指针指示的,换句话说,指针为数据元素之间的逻辑关系的映象,则逻辑上相邻的两个元素其存储的物理位置不要求紧邻,因此, 这种存储结构为非顺序映像或链式映像。当然,在php没有指针这个概念,但是我们可以用关联数组来模拟。
PHP数组实现单链表的代码如下:
<OL class=dp-xml><LI class=alt><SPAN><STRONG><FONT color=#006699><SPAN class=tag><?</SPAN><SPAN class=tag-name>php</SPAN></FONT></STRONG><SPAN> </SPAN></SPAN><LI class=""><SPAN>class LinkList </SPAN><LI class=alt><SPAN>{ </SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 成员变量 </SPAN><LI class=""><SPAN> * @var array $linkList 链表数组 </SPAN><LI class=alt><SPAN> * @var number $listHeader 表头索引 </SPAN><LI class=""><SPAN> * @var number $listLength 链表长度 </SPAN><LI class=alt><SPAN> * @var number $existedCounts 记录链表中出现过的元素的个数,和$listLength不同的是, 删除一 </SPAN><LI class=""><SPAN> * 个元素之后,该值不需要减1,这个也可以用来为新元素分配索引。 </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> protected $</SPAN><SPAN class=attribute><FONT color=#ff0000>linkList</FONT></SPAN><SPAN> =</SPAN><SPAN class=attribute-value><FONT color=#0000ff>array</FONT></SPAN><SPAN>(); </SPAN></SPAN><LI class=alt><SPAN> protected $</SPAN><SPAN class=attribute><FONT color=#ff0000>listLength</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN> protected $</SPAN><SPAN class=attribute><FONT color=#ff0000>listHeader</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>null</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> protected $</SPAN><SPAN class=attribute><FONT color=#ff0000>existedCounts</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 构造函数 </SPAN><LI class=""><SPAN> * 构造函数可以带一个数组参数,如果有参数,则调用成员方法 </SPAN><LI class=alt><SPAN> * createList将数组转换成链表,并算出链表长度.如果没有参 </SPAN><LI class=""><SPAN> * 数,则生成一空链表.空链表可以通过调用成员方法createList </SPAN><LI class=alt><SPAN> * 生成链表. </SPAN><LI class=""><SPAN> * @access public </SPAN><LI class=alt><SPAN> * @param array $arr 需要被转化为链表的数组 </SPAN><LI class=""><SPAN> */ </SPAN><LI class=alt><SPAN> public function __construct($</SPAN><SPAN class=attribute><FONT color=#ff0000>arr</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>''</FONT></SPAN><SPAN>) </SPAN></SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $arr!=null&&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>createList($arr); </SPAN></SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> /** </SPAN><LI class=""><SPAN> * 生成链表的函数 </SPAN><LI class=alt><SPAN> * 将数组转变成链表,同时计算出链表长度。分别赋值给成员标量 </SPAN><LI class=""><SPAN> * $linkList和$listLength. </SPAN><LI class=alt><SPAN> * @access public </SPAN><LI class=""><SPAN> * @param array $arr 需要被转化为链表的数组 </SPAN><LI class=alt><SPAN> * @return boolean true表示转换成功,false表示失败 </SPAN><LI class=""><SPAN> */ </SPAN><LI class=alt><SPAN> public function createList($arr) </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> if (!is_array($arr)) </SPAN><LI class=""><SPAN> return false; </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>length</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>count</FONT></SPAN><SPAN>($arr); </SPAN></SPAN><LI class=""><SPAN> for($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>;$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699><</FONT></STRONG></SPAN><SPAN>$length;$i++) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> if($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>==$length-1) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> //每个链表结点包括var和next两个索引,var表示结点值,next为下一个结点的索引 </SPAN><LI class=alt><SPAN> //最后一个结点的next为null </SPAN><LI class=""><SPAN> $list[$i]['var'] =$arr[$i]; </SPAN><LI class=alt><SPAN> $list[$i]['next'] =null; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> else </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $list[$i]['var'] =$arr[$i]; </SPAN><LI class=""><SPAN> $list[$i]['next'] =$i+1; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>linkList</FONT></SPAN><SPAN> =$list; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>listLength</FONT></SPAN><SPAN> =$length; </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>existedCounts</FONT></SPAN><SPAN> =$length; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>listHeader</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> return true; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> /** </SPAN><LI class=""><SPAN> * 将链表还原成一维数组 </SPAN><LI class=alt><SPAN> * @access public </SPAN><LI class=""><SPAN> * @return array $arr 生成的一维数组 </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> public function returnToArray() </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>arr</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>array</FONT></SPAN><SPAN>(); </SPAN></SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>tmp</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader]; </SPAN></SPAN><LI class=""><SPAN> for($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>;$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699><</FONT></STRONG></SPAN><SPAN>$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength;$i++) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> $arr[]=$tmp['var']; </SPAN><LI class=alt><SPAN> if ($i!=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength-1) </SPAN></SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>tmp</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$tmp['next']]; </SPAN></SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> return $arr; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN>public function getLength() </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> return $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength; </SPAN></SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 计算一共删除过多少个元素 </SPAN><LI class=""><SPAN> * @access public </SPAN><LI class=alt><SPAN> * @return number $count 到目前为止删除过的元素个数 </SPAN><LI class=""><SPAN> */ </SPAN><LI class=alt><SPAN> public function getDeletedNums() </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>count</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts-$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength; </SPAN></SPAN><LI class=""><SPAN> return $count; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 通过元素索引返回元素序号 </SPAN><LI class=""><SPAN> * @access protected </SPAN><LI class=alt><SPAN> * @param $index 元素的索引号 </SPAN><LI class=""><SPAN> * @return $num 元素在链表中的序号 </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> public function getElemLocation($index) </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> if (!array_key_exists($index,$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList)) </SPAN></SPAN><LI class=alt><SPAN> return false; </SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>arrIndex</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader; </SPAN></SPAN><LI class=alt><SPAN> for($</SPAN><SPAN class=attribute><FONT color=#ff0000>num</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>1</FONT></SPAN><SPAN>;$</SPAN><SPAN class=attribute><FONT color=#ff0000>tmp</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$arrIndex];$num++) </SPAN></SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> if ($</SPAN><SPAN class=attribute><FONT color=#ff0000>index</FONT></SPAN><SPAN>==$arrIndex) </SPAN></SPAN><LI class=""><SPAN> break; </SPAN><LI class=alt><SPAN> else </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>arrIndex</FONT></SPAN><SPAN>=$tmp['next']; </SPAN></SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> return $num; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 获取第$i个元素的引用 </SPAN><LI class=""><SPAN> * 这个保护方法不能被外界直接访问,许多服务方法以来与次方法。 </SPAN><LI class=alt><SPAN> * 它用来返回链表中第$i个元素的引用,是一个数组 </SPAN><LI class=""><SPAN> * @access protected </SPAN><LI class=alt><SPAN> * @param number $i 元素的序号 </SPAN><LI class=""><SPAN> * @return reference 元素的引用 </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> protected function &getElemRef($i) </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> //判断$i的类型以及是否越界 </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>result</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>false</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN> if (!is_numeric($i)||(int)$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699><</FONT></STRONG></SPAN><SPAN>=0||(int)$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength) </SPAN></SPAN><LI class=alt><SPAN> return $result; </SPAN><LI class=""><SPAN> //由于单链表中的任何两个元素的存储位置之间没有固定关系,要取得第i个元素必须从 </SPAN><LI class=alt><SPAN> //表头开始查找,因此单链表是非随机存储的存储结构。 </SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>j</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>value</FONT></SPAN><SPAN>=&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader]; </SPAN></SPAN><LI class=""><SPAN> while ($j</SPAN><SPAN class=tag><STRONG><FONT color=#006699><</FONT></STRONG></SPAN><SPAN>$i-1) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>value</FONT></SPAN><SPAN>=&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$value['next']]; </SPAN></SPAN><LI class=alt><SPAN> $j++; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> return $value; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> /** </SPAN><LI class=""><SPAN> * 返回第i个元素的值 </SPAN><LI class=alt><SPAN> * @access public </SPAN><LI class=""><SPAN> * @param number $i 需要返回的元素的序号,从1开始 </SPAN><LI class=alt><SPAN> * @return mixed 第i个元素的值 </SPAN><LI class=""><SPAN> */ </SPAN><LI class=alt><SPAN> public function getElemvar($i) </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>var</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>getElemRef($i); </SPAN></SPAN><LI class=""><SPAN> if ($var!=false) </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> return $var['var']; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> else return false; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> /** </SPAN><LI class=alt><SPAN> * 在第i个元素之后插入一个值为var的新元素 </SPAN><LI class=""><SPAN> * i的取值应该为[1,$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength],如果</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>0</FONT></SPAN><SPAN>,表示在表的最前段插入, </SPAN></SPAN><LI class=alt><SPAN> * 如果</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength,表示在表的末尾插入,插入的方法为,将第$i-1个元素 </SPAN></SPAN><LI class=""><SPAN> * 的next指向第$i个元素,然后将第$i个元素的next指向第$i+1个元素,这样就实现了插入 </SPAN><LI class=alt><SPAN> * @access public </SPAN><LI class=""><SPAN> * @param number $i 在位置i插入新元素 </SPAN><LI class=alt><SPAN> * @param mixed $var 要插入的元素的值 </SPAN><LI class=""><SPAN> * @return boolean 成功则返回true,否则返回false </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> public function insertIntoList($i,$var) </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> if (!is_numeric($i)||(int)$i</SPAN><STRONG><FONT color=#006699><SPAN class=tag><</SPAN><SPAN class=tag-name>0</SPAN></FONT></STRONG><SPAN>||(int)$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength) </SPAN></SPAN><LI class=alt><SPAN> return false; </SPAN><LI class=""><SPAN> if ($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>==0) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> //如果$i-0,则在表最前面添加元素,新元素索引为$listLength,这样是确保不会 </SPAN><LI class=alt><SPAN> //覆盖原来的元素,另外这种情况需要重新设置$listHeader </SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts]['var'] =$var; </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts]['next']=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>listHeader</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts; </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength++; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts++; </SPAN></SPAN><LI class=alt><SPAN> return true; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>value</FONT></SPAN><SPAN>=&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>getElemRef($i); </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts]['var'] =$var; </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts]['next']=($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>==$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength?null:$value['next']); </SPAN></SPAN><LI class=""><SPAN> $value['next']=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts; </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength++; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts++; </SPAN></SPAN><LI class=alt><SPAN> return true; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> /** </SPAN><LI class=""><SPAN> * 删除第$i个元素 </SPAN><LI class=alt><SPAN> * 删除第$i个元素,该元素为取值应该为[1,$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength],需要注意,删除元素之后, </SPAN></SPAN><LI class=""><SPAN> * $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength减1,而$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>existedCounts不变。删除的方法为将第$i-1个元素的 </SPAN></SPAN><LI class=alt><SPAN> * next指向第$i+1个元素,那么第$i个元素就从链表中删除了。 </SPAN><LI class=""><SPAN> * @access public </SPAN><LI class=alt><SPAN> * @param number $i 将要被删除的元素的序号 </SPAN><LI class=""><SPAN> * @return boolean 成功则返回true,否则返回false </SPAN><LI class=alt><SPAN> */ </SPAN><LI class=""><SPAN> public function delFromList($i) </SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> if (!is_numeric($i)||(int)$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699><</FONT></STRONG></SPAN><SPAN>=0||(int)$i</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength) </SPAN></SPAN><LI class=alt><SPAN> return false; </SPAN><LI class=""><SPAN> if ($</SPAN><SPAN class=attribute><FONT color=#ff0000>i</FONT></SPAN><SPAN>==1) </SPAN></SPAN><LI class=alt><SPAN> { </SPAN><LI class=""><SPAN> //若删除的结点为头结点,则需要从新设置链表头 </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>tmp</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader]; </SPAN></SPAN><LI class=""><SPAN> unset($this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listHeader]); </SPAN></SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN class=attribute><FONT color=#ff0000>listHeader</FONT></SPAN><SPAN>=$tmp['next']; </SPAN></SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength--; </SPAN></SPAN><LI class=alt><SPAN> return true; </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN> else </SPAN><LI class=""><SPAN> { </SPAN><LI class=alt><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>value</FONT></SPAN><SPAN> =&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>getElemRef($i); </SPAN></SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>prevValue</FONT></SPAN><SPAN>=&$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>getElemRef($i-1); </SPAN></SPAN><LI class=alt><SPAN> unset($this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>linkList[$prevValue['next']]); </SPAN></SPAN><LI class=""><SPAN> $prevValue['next']=$value['next']; </SPAN><LI class=alt><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>listLength--; </SPAN></SPAN><LI class=""><SPAN> return true; </SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> } </SPAN><LI class=alt><SPAN>/** </SPAN><LI class=""><SPAN> * 对链表的元素排序 </SPAN><LI class=alt><SPAN> * 谨慎使用此函数,排序后链表将被从新初始化,原有的成员变量将会被覆盖 </SPAN><LI class=""><SPAN> * @accse public </SPAN><LI class=alt><SPAN> * @param boolean $</SPAN><SPAN class=attribute><FONT color=#ff0000>sortType</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>'true'</FONT></SPAN><SPAN> 排序方式,true表示升序,false表示降序,默认true </SPAN></SPAN><LI class=""><SPAN> */ </SPAN><LI class=alt><SPAN>public function listSort($</SPAN><SPAN class=attribute><FONT color=#ff0000>sortType</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>'true'</FONT></SPAN><SPAN>) </SPAN></SPAN><LI class=""><SPAN>{ </SPAN><LI class=alt><SPAN> //从新修改关联关系可能会更复杂,所以我选择先还原成一维数组,然后对数组排序,然后再生成链表 </SPAN><LI class=""><SPAN> $</SPAN><SPAN class=attribute><FONT color=#ff0000>arr</FONT></SPAN><SPAN>=$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>returnToArray(); </SPAN></SPAN><LI class=alt><SPAN> $sortType?sort($arr):rsort($arr); </SPAN><LI class=""><SPAN> $this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></FONT></STRONG></SPAN><SPAN>createList($arr); </SPAN></SPAN><LI class=alt><SPAN>} </SPAN><LI class=""><SPAN>} </SPAN><LI class=alt><SPAN></SPAN><SPAN class=tag><STRONG><FONT color=#006699>?></FONT></STRONG></SPAN><SPAN> </SPAN></SPAN></LI></OL>上面这段代码就是PHP数组实现单链表的源码编写,希望对大家有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号