线性表和单向链表
今天介绍2个简单的数据结构:线性表&单向链表
线性表:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/11/6 * Time: 15:38 */ /** * 线性表 更利于数据的查找 时间O(n) * 不利于删除或新增 时间O(nlogn) * 在查询操作使用的比较频繁时,使用顺序表会好一些;在插入、删除操作使用的比较频繁时,使用单链表会好一些。 * Class arrayList */ class arrayList { private $arr; private $length; const MAX_SIZE=100; /** * arrayList constructor. * @param $arr * @param $length */ function __construct($arr,$length) { $this->arr=$arr; $this->length=$length; } /** * 根据位置查找值 * @param $n * @return string */ function findValue($n) { if($n<1||$n>$this->length) return '起始位置超出索引范围'; return $this->arr[$n-1]; } /** * 根据值来查找位置 * @param $value */ function findSite($value) { if(empty($value)||!isset($value)) return '值不允许为空!'; foreach ($this->arr as $key=>$v) { if($v==$value) return $key+1; } return '您查找的值不存在'; } /** * 在指定位置插入值 * @param $val * @param $n */ function insertVal($val,$n) { if($n<1||$n>($this->length+1)) return '索引查过数组的索引范围'; for($h=$this->length;$h>=$n;$h--) { $this->arr[$h] = $this->arr[$h-1]; } if($n>$this->length) $this->arr[$this->length]=$val; else $this->arr[$n-1] = $val; $this->length++; return $this->arr; } /** * 删除指定元素 * @param $n */ function deleteVal($n) { if($n<1||$n>$this->length) return '索引查过数组的索引范围'; for($k=$this->length;$k>=$n;$k--) { $this->arr[$k-2]=$this->arr[$k-1]; } unset($this->arr[$this->length-1]); $this->length--; return $this->arr; } function showValue() { if($this->length<=0) echo '数组为空!'; foreach ($this->arr as $key=>$val) { echo 'key:'.$key.' value:'.$val.'</br>'; } } function __destruct() { echo '销毁链表!'; } } $arr = array(1,3,4,6,7); $arrayList = new arrayList($arr,5); //查找 echo $arrayList->findValue(1); echo $arrayList->findSite(4); //新增 $arrayList->insertVal('xxx',3); $arrayList->showValue(); //删除 $arrayList->deleteVal(3); $arrayList->showValue();
链表:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。它的数据是以结点(类型一般为结构体)来表示的,每个结点的构成:数据(类型为要存储的数据的类型) + 指针(结构体指针),数据就是链表里具体要存储的东西,指针就是用来把每个节点都连接起来,使它们形成一个链状。
结点:
链表:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/11/6 * Time: 15:38 */ class node { public $id; public $name; public $next; function __construct($id,$name) { $this->id=$id; $this->name=$name; } } /** * 单向链表 便于删除和插入 时间O(n) * 不利于查找 时间O(n) * Class linkedList */ class linkedList { private $head; /** * linkedList constructor * 初始化头节点. * @param null $id * @param null $name */ function __construct($id=null,$name=null) { $this->head=new node($id,$name); } function getLinkedListLength() { $i=0; $current = $this->head; while($current->next!=null){ $i++; $current = $current->next; } return $i; } function insertNode($node) { $current = $this->head; while($current->next!=null) { if($current->next->id>$node->id) break; $current = $current->next; } $node->next =$current->next; $current->next = $node; } function delNode($id) { $current = $this->head; $flag = false; //是否存在该节点 while($current->next!=null) { if($current->next->id == $id){ $flag = true; break; } $current = $current->next; } if($flag) $current->next = $current->next->next; else echo '该节点不存在!'; } function getLinecked() { $current = $this->head; if($current->next==null) echo '链表为空!'; while($current->next!=null) { echo 'id:'.$current->next->id.' name:'.$current->next->name.'</br>'; if($current->next->next == null) break; $current=$current->next; } } function getLinkedNameById($id) { $current = $this->head; if($current->next==null) echo '链表为空!'; while($current->next!=null) { if($current->id==$id) { break; } $current = $current->next; } return $current->name; } function updateLinkedNode($node) { $current = $this->head; if($current->next==null) echo '链表为空!'; while($current->next!=null) { if($current->id == $node->id) break; $current=$current->next; } $current->name=$node->name; } function __destruct() { echo '销毁单向链表!'.'</br>'; } } $linkes = new linkedList(); $linkes->insertNode(new Node(1,'xll')); $linkes->insertNode(new Node(2,'cyq')); $linkes->insertNode(new Node(4,'cyq1')); $linkes->insertNode(new Node(7,'cyq12')); $linkes->getLinecked(); //删除 $linkes->delNode(1); $linkes->getLinecked(); //根据id $linkes->getLinkedNameById(2); //更新node $linkes->updateLinkedNode(new node(2,'xulele')); $linkes->getLinecked();
总论:
一般如果读的操作比较频繁,则推荐使用线性表;如果插入或者删除的操作比较频繁则推荐使用单向链表
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下右下角的【关注 LeLe.Xu】。
因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是LeLe.Xu 。