链表的结构是由一个一个节点组成的,所谓链,就是每个节点的头尾连在一起。而单向链表就是:每个节点包含了当前节点的值和下一个节点引用。双向链表就是每个节点包含了当前节点的值和上下两个节点的引用。相对于数组结构,链表的增删效率会更加高。
单向链表(示意图):
PHP代码实现
/**
* 链表结构
*/
class Hero{
public $no;
public $name;
public $next=null;
public function __construct($no=null,$name=null){
$this->no = $no;
$this->name = $name;
}
}
/**
* 链表操作
*/
class SingleLink{
/**
* 添加节点
*/
public function addNode($head,$node)
{
$insertNode = $head;
$afterNode = null; // 插入节点的后续节点
while ($insertNode->next!=null){
if ($node->no < $insertNode->next->no){
$afterNode = $insertNode->next;
break;
}elseif($node->no == $insertNode->next->no){
throw new \Exception('排名 '.$node->no.' 节点已存在!');
}
$insertNode = $insertNode->next;
}
if( $afterNode ){ // 将后续节点拼接到当前插入节点的后面
$node->next = $afterNode;
}
$insertNode->next = $node;
}
/**
* 删除节点
*/
public function delNode($head,$no)
{
$currentNode = $head;
$prevNode = $head;
while ($currentNode->next!=null){
$currentNode = $currentNode->next;
if( $currentNode->no==$no ){
$prevNode->next = $currentNode->next;
break;
}
$prevNode = $currentNode;
}
}
/**
* 显示节点
*/
public function showNode($head)
{
$currentNode = $head;
while ($currentNode->next!=null){
$currentNode = $currentNode->next;
echo '第 '.$currentNode->no.' 名:'.$currentNode->name."<br/>";
}
}
}
//创建一个head头,该head 只是一个头,不放入数据
$head = new Hero();
$heroList = new SingleLink();
$hero_01 = new Hero(1,'宋江');
$hero_02 = new Hero(2,'卢俊义');
$hero_03 = new Hero(3,'公孙胜');
$hero_04 = new Hero(4,'吴用');
$hero_05 = new Hero(5,'关胜');
$hero_06 = new Hero(6,'林冲');
$heroList->addNode($head, $hero_01);
$heroList->addNode($head, $hero_03);
$heroList->addNode($head, $hero_02);
$heroList->addNode($head, $hero_05);
$heroList->addNode($head, $hero_04);
$heroList->addNode($head, $hero_06);
//$heroList->addNode($head, $hero_02);
$heroList->showNode($head);
echo "<br/><br/>";
$heroList->delNode($head,3);
$heroList->delNode($head,5);
$heroList->showNode($head);
参考:
韩顺平PHP程序员玩转算法公开课
https://www.cnblogs.com/Starshot/p/6918569.html
https://blog.csdn.net/silent123go/article/details/52693735