php实现单链表(静态链表)

<?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;
}
}
}
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值