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 相关文章推荐
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
php echo 输出字符串函数详解
May 13 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
基于PHP magic_quotes_gpc的使用方法详解
Jun 24 PHP
php实现的发送带附件邮件类实例
Sep 22 PHP
php学习笔记之基础知识
Nov 08 PHP
php实现异步数据调用的方法
Dec 24 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
Yii2中datetime类的使用
Dec 17 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 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中单例模式与工厂模式详解
2017/02/17 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
鼠标图片振动代码
2006/07/06 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
Python logging模块原理解析及应用
2020/08/13 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
楼面经理岗位职责范本
2014/02/18 职场文书
西柏坡观后感
2015/06/08 职场文书
实习证明格式范文
2015/06/16 职场文书
人力资源部工作计划
2019/05/14 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android