2.2.1 单链表

<?php
header("content-type:text/html;charset=utf-8");
class List_node{
    /**
     * 单链表基本操作
     *
     *包括
     *1.单链表的初始化 __contruct()
     *2.单链表的创建——头插法
     *3.单链表的创建——尾插法
     *4.单链表的整表删除
     *5.获取单链表中指定位置的数据元素
     *6.在指定位置之前插入一个数据元素
     *7.删除指定位置的数据元素
     */
    private $data;
    private $next;

    public function __construct()
    {
        $this->data = null;
        $this->next = null;
    }
    //具有$num个数据元素的单链表的创建——头插法
    public function createListHead($num){

        for($i=0;$i<$num;$i++){
            $list_node = new List_node();//生成新的结点
            $list_node->data = rand(0,100);
            $list_node->next = $this->next;
            $this->next = $list_node;//插入到表头
        }

    }
//具有$num个数据元素的单链表的创建——尾插法
    public function createListTail($num){
        $tail=$this;
        for($i=0;$i<$num;$i++){
            $list_node = new List_node();
            $list_node->data = rand(0,100);
            $tail->next = $list_node;//表尾终端结点的指针指向新的结点
            $tail = $list_node;

        }
        $list_node->next = null;
    }
//单链表的整表删除
    public function clearList(){
        $p = $this->next;//p指向第一个结点
        while ($p){      //没有到表尾
            $node=$p->next;
            unset($p);
            $p = $node;
        }
        $this->next=null;
    }
//返回单链表中指定位置的数据元素
/*
 * 算法思路:
 * 1.声明指针p指向链表第一个结点,初始化计数器count从1开始
 * 2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,count累加1
 * 3.若到链表末尾p为空,则说明第pos结点不存在
 * 4.否则查找成功,返回结点p的数据
 */
    public function getElem($pos){
        $count=1;//计数器
        $p=$this->next;//p指向链表的第一个指针
        while($p && $count<$pos){//p不为空且计数器还没有达到pos时,循环继续
            $count++;
            $p=$p->next;//让p指向下一个结点
        }
        if(!$p || $pos<$count){
            return 'ERROR';
        }
        return $p->data;//取第pos个结点的数据
    }
    //在指定位置之前插入一个数据元素
    /*
     * 1.声明指针p指向链表头结点,初始化count从1开始
     * 2.当count<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,同时count累加1
     * 3.若到链表末尾p为空,则说明第pos个结点不存在
     * 4.否则查找成功,生成一个空结点node
     * 5.单链表插入语句 $node->next = $p->next;$p->next = $node;
     */
    public function listInsert($pos,$elem){
        $p=$this;
        $count=1;
        while($p && $count<$pos){
            $count++;
            $p=$p->next;
        }
        if(!$p || $count>$pos){
            return 'ERROR';
        }
        $node = new List_node();
        $node->data = $elem;
        $node->next = $p->next;
        $p->next = $node;
        return 'OK';
    }
    // 删除指定位置的数据元素
    /*
     * 1.声明指针p指向链表头结点,初始化count从1开始
     * 2.当count<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,同时count累加1
     * 3.若到链表末尾p为空,则说明第pos个结点不存在
     * 4.否则查找成功,将欲删除的结点$p->next赋值给q
     * 5.单链表的删除语句$p->next = $q->next;
     * 6.释放q结点
     */
    public function listDelete($pos){
        $p = $this;
        $count = 1;
        while ($p && $count< $pos){
            $count++;
            $p=$p->next;
        }
        if(!$p || $count>$pos){
            return 'ERROR';
        }
        $q = $p->next;
        $p->next = $q->next;
        unset($q);
        return 'OK';
    }
}
?>

可以参考下图进行操作(截图来自大话数据结构

头插法:

尾插法:

单链表插入:

单链表删除:

下面我们就实践一下我们的函数吧

1.头插法和尾插法的实现

<?php
header("content-type:text/html;charset=utf-8");
include 'list_node.class.php';
$list_node = new List_node();
$list_node->createListHead(10);
print_r($list_node);
echo ("</br>");
$list_node->createListTail(10);
print_r($list_node);
echo ("</br>");

?>

输出结果:

2.整表删除

<?php
header("content-type:text/html;charset=utf-8");
include 'list_node.class.php';
$list_node = new List_node();
$list_node->createListHead(10);
print_r($list_node);
echo ("</br>");

$list_node->clearList();
print_r($list_node);
echo ("</br>");
?>

输出结果:

3.获取,插入和删除

<?php
header("content-type:text/html;charset=utf-8");
include 'list_node.class.php';
$list_node = new List_node();
$list_node->createListHead(10);
print_r($list_node);
echo ("</br>");
echo ("</br>");
$e = $list_node->getElem(2);
echo $e;
echo ("</br>");
echo ("</br>");
$list_node->listInsert(2,666);
print_r($list_node);
echo ("</br>");
echo ("</br>");
$list_node->listDelete(2);
print_r($list_node);
?>

输出结果:

原文地址:https://www.cnblogs.com/xlzfdddd/p/9807998.html