PHP双向链表定义与用法示例
本文实例讲述了PHP双向链表定义与用法。分享给大家供大家参考,具体如下:
由于需要对一组数据多次进行移动操作,所以写个双向链表。但对php实在不熟悉,虽然测试各个方法没啥问题,就是不知道php语言深层的这些指针和unset有什么注意的地方,贴出来让大家教育吧。效率没测试....求谅解~
key=$key;
$this->data=$data;
}
}
/**
*双向链表类
*/
classDoubleLinkedList{
private$head;//头指针
private$tail;//尾指针
private$current;//当前指针
private$len;//链表长度
function__Construct(){
$this->head=self::_getNode(null,null);
$this->curelement=$this->head;
$this->tail=$this->head;
$len=0;
}
/**
*@desc:读取链表全部结点
*/
publicfunctionreadAll(){
$tmp=$this->head;
while($tmp->next!==null){
$tmp=$tmp->next;
var_dump($tmp->key,$tmp->data);
}
}
publicfunctionmove($pos1,$pos2){
$pos1Node=$this->findPosition($pos1);
$pos2Node=$this->findPosition($pos2);
if($pos1Node!==null&&$pos2Node!==null){
$tmpKey=$pos1Node->key;
$tmpData=$pos1Node->data;
$pos1Node->key=$pos2Node->key;
$pos1Node->data=$pos2Node->data;
$pos2Node->key=$tmpKey;
$pos2Node->data=$tmpData;
returntrue;
}
returnfalse;
}
/**
*@desc:在指定关键词删除结点
*
*@param:$key
*指定位置的链表元素key
*/
publicfunctiondelete($key){
$pos=$this->find($key);
if($pos!==null){
$tmp=$pos;
$last=null;
$first=true;
while($tmp->next!==null&&$tmp->next->key===$key){
$tmp=$tmp->next;
if(!$first){
$this->delNode($last);
}else{
$first=false;
}
$last=$tmp;
}
if($tmp->next!==null){
$pos->pre->next=$tmp->next;
$tmp->next->pre=$pos->pre;
}else{
$pos->pre->next=null;
}
$this->delNode($pos);
$this->delNode($tmp);
}
}
/**
*@desc:在指定位置删除结点
*
*@param:$key
*指定位置的链表元素key
*/
publicfunctiondeletePosition($pos){
$tmp=$this->findPosition($pos);
if($tmp===null){
returntrue;
}
if($tmp===$this->getTail()){
$tmp->pre->next=null;
$this->delNode($tmp);
returntrue;
}
$tmp->pre->next=$tmp->next;
$tmp->next->pre=$tmp->pre;
$this->delNode($tmp);
}
/**
*@desc:在指定键值之前插入结点
*
*@param:$key
*//指定位置的链表元素key
*@param:$data
*//要插入的链表元素数据
*@param:$flag
*//是否顺序查找位置进行插入
*/
publicfunctioninsert($key,$data,$flag=true){
$newNode=self::_getNode($key,$data);
$tmp=$this->find($key,$flag);
if($tmp!==null){
$newNode->pre=$tmp->pre;
$newNode->next=$tmp;
$tmp->pre=$newNode;
$newNode->pre->next=$newNode;
}else{
$newNode->pre=$this->tail;
$this->tail->next=$newNode;
$this->tail=$newNode;
}
$this->len++;
}
/**
*@desc:在指定位置之前插入结点
*
*@param:$pos
*指定插入链表的位置
*@param:$key
*指定位置的链表元素key
*@param:$data
*要插入的链表元素数据
*/
publicfunctioninsertPosition($pos,$key,$data){
$newNode=self::_getNode($key,$data);
$tmp=$this->findPosition($pos);
if($tmp!==null){
$newNode->pre=$tmp->pre;
$newNode->next=$tmp;
$tmp->pre=$newNode;
$newNode->pre->next=$newNode;
}else{
$newNode->pre=$this->tail;
$this->tail->next=$newNode;
$this->tail=$newNode;
}
$this->len++;
returntrue;
}
/**
*@desc:根据key值查询指定位置数据
*
*@param:$key
*//指定位置的链表元素key
*@param:$flag
*//是否顺序查找
*/
publicfunctionfind($key,$flag=true){
if($flag){
$tmp=$this->head;
while($tmp->next!==null){
$tmp=$tmp->next;
if($tmp->key===$key){
return$tmp;
}
}
}else{
$tmp=$this->getTail();
while($tmp->pre!==null){
if($tmp->key===$key){
return$tmp;
}
$tmp=$tmp->pre;
}
}
returnnull;
}
/**
*@desc:根据位置查询指定位置数据
*
*@param:$pos
*//指定位置的链表元素key
*/
publicfunctionfindPosition($pos){
if($pos<=0||$pos>$this->len)
returnnull;
if($pos<($this->len/2+1)){
$tmp=$this->head;
$count=0;
while($tmp->next!==null){
$tmp=$tmp->next;
$count++;
if($count===$pos){
return$tmp;
}
}
}else{
$tmp=$this->tail;
$pos=$this->len-$pos+1;
$count=1;
while($tmp->pre!==null){
if($count===$pos){
return$tmp;
}
$tmp=$tmp->pre;
$count++;
}
}
returnnull;
}
/**
*@desc:返回链表头节点
*/
publicfunctiongetHead(){
return$this->head->next;
}
/**
*@desc:返回链表尾节点
*/
publicfunctiongetTail(){
return$this->tail;
}
/**
*@desc:查询链表节点个数
*/
publicfunctiongetLength(){
return$this->len;
}
privatestaticfunction_getNode($key,$data){
$newNode=newNode_Element($key,$data);
if($newNode===null){
echo"newnodefail!";
}
return$newNode;
}
privatefunctiondelNode($node){
unset($node);
$this->len--;
}
}
$myList=newDoubleLinkedList();
$myList->insert(1,"test1");
$myList->insert(2,"test2");
$myList->insert("2b","test2-b");
$myList->insert(2,"test2-c");
$myList->insert(3,"test3");
$myList->insertPosition(5,"t","testt");
$myList->readAll();
echo"+++";
$myList->deletePosition(0);
$myList->readAll();
echo"...".$myList->getLength();
var_dump($myList->findPosition(3)->data);
?>
运行结果:
int(1) string(5)"test1" int(2) string(7)"test2-c" int(2) string(5)"test2" string(2)"2b" string(7)"test2-b" string(1)"t" string(5)"testt" int(3) string(5)"test3" +++int(1) string(5)"test1" int(2) string(7)"test2-c" int(2) string(5)"test2" string(2)"2b" string(7)"test2-b" string(1)"t" string(5)"testt" int(3) string(5)"test3" ...6string(5)"test2"
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。