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 相关文章推荐
一次编写,随处运行
Oct 09 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
在PHP中操作Excel实例代码
Apr 29 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
php判断linux下程序问题实例
Jul 09 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
thinkPHP订单数字提醒功能的实现方法
Dec 01 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php中类和对象:静态属性、静态方法
Apr 09 PHP
微信小程序和php的登录实现
Apr 01 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
解决中英文字符串长度问题函数
2007/01/16 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
老生常谈js数据类型
2017/08/03 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python实现bucket排序算法实例分析
2015/05/04 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python自动扫雷实现方法
2015/07/25 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
房产委托公证书样本
2014/04/04 职场文书
优秀员工演讲稿
2014/05/19 职场文书
安全演讲稿开场白
2014/08/25 职场文书
结婚老公保证书
2015/02/26 职场文书
幼儿园个人总结
2015/02/28 职场文书
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python