<?php
/*
* 单链表的PHP实现
*
* @author zhaojiangwei
* @since 2011/10/20
*/
//结点类
class Node{
private $next = NULL; //下一个结点指针
private $data = NULL; //数据
public function Node($data, $next = NULL){
$this->data = $data;
$next && $this->next = $next;
}
public function getData(){
return $this->data;
}
public function setData($data){
$this->data = $data;
}
public function getNext(){
return $this->next;
}
public function setNext($next){
$this->next = $next;
}
}
//单链表类
class LinkList{
private $data_list = NULL; //结点集
public function LinkList($data = false){
$this->data_list = array();
$title = new Node(NULL);
$this->data_list[] = $title;
if($data){
if(is_array($data)){
$this->addMoreData($data);
}else{
$this->addData($data);
}
}
}
//返回第N个结点的值
public function getNodeByNumber($number){
return $this->data_list[$this->findKeyByNumber($number)]->getData();
}
//添加一组结点
public function addMoreData($datas){
foreach($datas as $value){
$this->addData($value);
}
}
//添加结点统一入口,供外面调用
//$number 添加在第几个结点的后面
public function addData($data, $number = false){
$node = new Node($data);
if($number === FALSE || $number == count($this->data_list)){
$this->insertLastNode($node);
}elseif($number > count($this->data_list)){
return false;
}else{
$this->insertNode($node, $number);
}
}
//插入一个结点到最后
private function insertLastNode($node){
$node->setNext(NULL);
$lastKey = $this->findLastNode();
$insert_key = $this->insertNodeIntoArray($node);
$this->data_list[$lastKey]->setNext($insert_key);
}
//插入一个结点
private function insertNode($node, $number){
$insert_number = $this->findKeyByNumber($number);
$node->setNext($this->data_list[$insert_number]->getNext());
$insert_key = $this->insertNodeIntoArray($node);
$this->data_list[$insert_number]->setNext($insert_key);
}
//查找第N个结点对应的数组key
private function findKeyByNumber($number){
$i = $key = 0;
while($i < $number){
$key = $this->data_list[$key]->getNext();
$i ++;
}
return $key;
}
//将结点加入数组
private function insertNodeIntoArray($node){
$this->data_list[] = $node;
return $this->getLastKey();
}
//删除结点
public function deleteNode($number){
if($number == 0 || $number > count($this->data_list)){
return false;
}
$pre_key = $this->findKeyByNumber($number - 1);
$key = $this->data_list[$pre_key]->getNext();
$this->data_list[$pre_key]->setNext($this->data_list[$key]->getNext());
unset($this->data_list[$key]);
}
//查找某结点的前一个结点
private function getPreNodeKey($key){
foreach($this->data_list as $k=>$v){
if($v->getNext() == $key){
return $k;
}
}
return false;
}
//打印链表
public function getData_list(){
return $this->data_list;
}
//返回数组的最后一个键
private function getLastKey(){
end($this->data_list);
return key($this->data_list);
}
//判断某个键值是否存在
private function ifExistKey($key){
if(array_key_exists($key, $this->data_list)){
return true;
}
return false;
}
//查找尾结点
public function findLastNode(){
foreach($this->data_list as $key=>$value){
if($value->getNext() === NULL){
return $key;
}
}
}
}
?>