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实现的下载css文件中的图片的代码
Feb 08 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
Laravel实现短信注册的示例代码
May 29 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 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
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
event.srcElement+表格应用
2006/08/29 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
python文字转语音的实例代码分析
2019/11/12 Python
python适合做数据挖掘吗
2020/06/16 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python爬虫如何解决图片验证码
2021/02/14 Python
写出二分查找算法的两种实现
2013/05/13 面试题
什么是GWT的Entry Point
2013/08/16 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
国税会议欢迎词
2014/01/16 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis