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多个版本的分析解释
Jul 21 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
php session劫持和防范的方法
Nov 12 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP共享内存用法实例分析
Feb 12 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP yield关键字功能与用法分析
Jan 03 PHP
php+ajax 文件上传代码实例
Mar 18 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
详解PHP Swoole与TCP三次握手
May 27 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
海贼王:最美的悬赏令!
2020/03/02 日漫
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
第六章 php目录与文件操作
2011/12/30 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
js使用心得分享
2015/01/13 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
python程序输出无内容的解决方式
2020/04/09 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
英国假发网站:Hothair
2018/02/23 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
文员自我评价怎么写
2013/09/19 职场文书
运动会广播稿30字
2014/01/21 职场文书
大二学习计划书范文
2014/04/27 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
八年级英语教学计划
2015/01/23 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
超强台风观后感
2015/06/09 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
详解非极大值抑制算法之Python实现
2021/06/28 Python
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis