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之第七天
Oct 09 PHP
实用函数9
Nov 08 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
php+ajax 文件上传代码实例
Mar 18 PHP
PHP实现八皇后算法
May 06 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
打造计数器DIY三步曲(上)
2006/10/09 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
JS抛物线动画实例制作
2018/02/24 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
python中如何进行连乘计算
2020/05/28 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
django使用channels实现通信的示例
2020/10/19 Python
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
考试没考好检讨书
2014/01/31 职场文书
测量工程专业求职信
2014/02/24 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
企业法人授权委托书
2014/09/25 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
音乐剧猫观后感
2015/06/04 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle