PHP实现链表的定义与反转功能示例


Posted in PHP onJune 09, 2018

本文实例讲述了PHP实现链表的定义与反转功能。分享给大家供大家参考,具体如下:

PHP定义链表及添加、移除、遍历等操作:

<?php
class Node
{
  private $Data;//节点数据
  private $Next;//下一节点
 
  public function setData($value){
    $this->Data=$value;
  }
 
  public function setNext($value){
     $this->Next=$value;
  }  
 
  public function getData(){
    return $this->Data;
  }
 
  public function getNext(){
    return $this->Next;
  }
 
  public function __construct($data,$next){
    $this->setData($data);
    $this->setNext($next);
  }
}
class LinkList
{
  private $header;//头节点
  private $size;//长度
  public function getSize()
 {
    $i=0;
    $node=$this->header;
    while($node->getNext()!=null)
    {  
  $i++;
      $node=$node->getNext();
    }
    return $i;
  }
 
  public function setHeader($value){
    $this->header=$value;
  }
 
  public function getHeader(){
    return $this->header;
  }
 
  public function __construct(){
    header("content-type:text/html; charset=utf-8");
    $this->setHeader(new Node(null,null));
  }
  /**
  *@author MzXy
  *@param $data--要添加节点的数据
  * 
  */
  public function add($data)
  {
    $node=$this->header;
    while($node->getNext()!=null)
    {
      $node=$node->getNext();
    }
    $node->setNext(new Node($data,null));
  }
   /**
  *@author MzXy
  *@param $data--要移除节点的数据
  * 
  */
  public function removeAt($data)
  {
    $node=$this->header;
    while($node->getData()!=$data)
    {
      $node=$node->getNext();
    }
    $node->setNext($node->getNext());
    $node->setData($node->getNext()->getData());
  }
   /**
  *@author MzXy
  *@param 遍历
  * 
  */
  public function get()
  {
    $node=$this->header;
    if($node->getNext()==null){
      print("数据集为空!");
      return;
    }
    while($node->getNext()!=null)
    {
      print('['.$node->getNext()->getData().'] -> ');
      if($node->getNext()->getNext()==null){break;}
      $node=$node->getNext();
    }
  }
   /**
  *@author MzXy
  *@param $data--要访问的节点的数据
  * @param 此方法只是演示不具有实际意义
  * 
  */
  public function getAt($data)
  {
    $node=$this->header->getNext();
  if($node->getNext()==null){
      print("数据集为空!");
      return;
    }
    while($node->getData()!=$data)
    {
      if($node->getNext()==null){break;}
      $node=$node->getNext();
    }
    return $node->getData();    
  }
   /**
  *@author MzXy
  *@param $value--需要更新的节点的原数据 --$initial---更新后的数据
  * 
  */
  public function update($initial,$value)
  {
     $node=$this->header->getNext();
 if($node->getNext()==null){
     print("数据集为空!");
      return;
    }
    while($node->getData()!=$data)
    {
      if($node->getNext()==null){break;}
      $node=$node->getNext();
    }
 $node->setData($initial);   
  }
}
$lists = new LinkList();
$lists -> add(1);
$lists -> add(2);
$lists -> get();
echo '<pre>';
print_r($lists);
echo '</pre>';
?>

反转链表操作:

1. 常用的方法:左右交替,下一个结点保存,上一个结点替换该结点的下个结点。实现替换。

代码:

function ReverseList($pHead)
{
  // write code here
  if($pHead == null || $pHead->next == null){
    return $pHead;
  }
  $p = $pHead;
  $q = $pHead->next;
  $pHead->next = null;//$pHead 变为尾指针
  while($q){
    $r = $q->next;
    $q->next = $p;
    $p = $q;
    $q = $r;
  }
  return $p;
}

2. 使用递归方法。三个结点,头结点,首节点,第二个结点。把首节点后面的所有结点当成第二个结点,依次循环下去,由于要满足 $pHead != null || $pHead->next != null ;所以不会出现遍历不完的情况

function ReverseList($pHead)
{
  // write code here
  if($pHead == null || $pHead->next == null){
    return $pHead;
  }
  $res = ReverseList($pHead->next);
  $pHead->next->next = $pHead;
  $pHead->next = null;
  return $res;
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
获得Google PR值的PHP代码
Jan 28 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 #PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 #PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 #PHP
Laravel程序架构设计思路之使用动作类
Jun 07 #PHP
laravel手动创建数组分页的实现代码
Jun 07 #PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 #PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 #PHP
You might like
初级的用php写的采集程序
2007/03/16 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
javascript 回调函数详解
2014/11/11 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
浅析javascript的return语句
2015/12/15 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Python处理CSV与List的转换方法
2018/04/19 Python
windows下python和pip安装教程
2018/05/25 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
化学系大学生自荐信范文
2014/03/01 职场文书
小学毕业寄语大全
2014/04/03 职场文书
安徽导游词
2015/02/12 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
索尼ICF-5900W收音机测评
2022/04/24 无线电