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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php引用返回与取消引用的详解
Jun 08 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
php导出CSV抽象类实例
Sep 24 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
php 中的closure用法详解
Jun 12 PHP
php探针不显示内存解决方法
Sep 17 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
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
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
获取URL文件名后缀
2013/10/24 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
javascript函数重载解决方案分享
2014/02/19 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Django设置Postgresql的操作
2020/05/14 Python
python的launcher用法知识点总结
2020/08/07 Python
python 实现控制鼠标键盘
2020/11/27 Python
VC++笔试题
2014/10/13 面试题
Java面试笔试题大全
2016/11/23 面试题
人事助理岗位职责
2013/11/18 职场文书
自荐信需注意事项
2014/01/25 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
python的变量和简单数字类型详解
2021/09/15 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技
MySQL GTID复制的具体使用
2022/05/20 MySQL