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 相关文章推荐
Discuz 模板引擎的封装类代码
Jul 18 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
教你如何快捷的使用cmd访问mysql小技巧
May 26 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
php实现的mongodb操作类实例
Apr 03 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 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 注册时输入信息验证器的实现详解
2013/07/05 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
python获取代码运行时间的实例代码
2018/06/11 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
门卫班长岗位职责
2013/12/15 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
python中sys模块的介绍与实例
2021/04/17 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python