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 相关文章推荐
php中看实例学正则表达式
Dec 25 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
pdo中使用参数化查询sql
Aug 11 PHP
PHP获取文件行数的方法
Jun 10 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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
动易数据转成dedecms的php程序
2007/04/07 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
关于php开启错误提示的总结
2019/09/24 PHP
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python连接oracle数据库实例
2014/10/17 Python
Python最基本的输入输出详解
2015/04/25 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
python异常处理和日志处理方式
2019/12/24 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Python实现上下文管理器的方法
2020/08/07 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
函授自我鉴定
2013/11/06 职场文书
酒后驾车标语
2014/06/30 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python