php 实现双向链表 及 建立链表耗时

这个就是为了学习而使用,php有自身的链表实现,功能更全面,百度搜索 php spl

<?php
class node {
	public $val = null;
	public $pre = null;
	public $nex = null;
	//存放该node的位置
	public $index = null;
	public $num = 1;
	public function __construct($val){
		$this->val = $val;
		$this->pre = null;
		$this->nex = null;
	}
}

class links{
	//链表头
	static $head = null;
	//链表尾
	static $end = null;
	//链表内容
	static $nodes = [];
	
	/**
	 * 添加一个节点
	 * @param int $val 节点内容
	 */
	public static function add($val){
		//初始化一个节点
		$newNode = new node($val);
		$newNode->index = count(static::$nodes);
		static::$nodes[$newNode->index] = $newNode;
		//链表为空
		if( static::$head === null ){
			//头和尾都指向这个节点
			static::$head = $newNode->index;
			static::$end = $newNode->index;
		}else{
			static::searchSet($newNode, static::$nodes[static::$head]);
		}
	}

	/**
	 * 搜索链表插入
	 * @param node $newNode 新节点
	 * @param node $node 链表中的节点,和新节点做比较
	 */
	public static function searchSet($newNode, $node){
		//新插入的节点值小于目标节点值,则在目标节点前插入
		if($newNode->val < $node->val){
			if($node->pre === null){//如果目标节点前一个指向的是null,则说明需要在链表开头插入
				static::$head = $newNode->index;
			}else{//否则将前一个节点的后指针指向新节点,新节点的前指针指向前一个节点
				$pre = static::$nodes[$node->pre];
				$pre->nex = $newNode->index;
				$newNode->pre = $pre->index;
			}

			//新节点的后指针指向目标节点
			$newNode->nex = $node->index;
			//目标节点前指针指向新节点
			$node->pre = $newNode->index;

		}elseif($newNode->val == $node->val){
			++$node->num;
		}else{//新节点和下个节点比较
			if($node->nex === null){//如果下个节点为null,说明在链表尾部插入新节点
				$node->nex = $newNode->index;
				$newNode->pre = $node->index;
				static::$end = $newNode->index;
			}else{
				static::searchSet($newNode, static::$nodes[$node->nex]);
			}
		}
	}

    /**
     * 输出
     * @param bool $isasc 是否为正序输出
     */
	public static function printfs($isasc=true){
        static $index = null;

		if($index === null){
			if($isasc){
				$index = static::$head;
			}else{
				$index = static::$end;
			}
		}
		
		echo static::$nodes[$index]->val . ' ';

		if($isasc){
			if(static::$nodes[$index]->nex === null) return;
			$index = static::$nodes[$index]->nex;
		}else{
			if(static::$nodes[$index]->pre === null) return;
			$index = static::$nodes[$index]->pre;
		}

        static::printfs($isasc);
	}
}


function microtimeFloat() {
        list($usec, $sec) = explode(" ", microtime());
        return ((float) $usec + (float) $sec);
}


$time = microtimeFloat();
$ary = range(0, 1000);
shuffle($ary);

foreach($ary as $v){
	links::add($v);	
}
$time2 = microtimeFloat();
links::printfs();
$time3 = microtimeFloat();
echo "\n\n";
links::printfs(0);
$time4 = microtimeFloat();

echo "---------------\n";
echo ($time2 - $time) . "\n";
echo ($time3 - $time2) . "\n";
echo ($time4 - $time3) . "\n";

此条目发表在php小程序分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

看不清?