• 技术文章 >后端开发 >php教程

    关于PHP如何实现链表的定义与反转功能

    不言不言2018-06-19 11:00:42原创1219
    这篇文章主要介绍了PHP实现链表的定义与反转功能,结合实例形式分析了PHP链表的基本定义、添加、移除、遍历以及两种反转操作相关实现技巧,需要的朋友可以参考下

    本文实例讲述了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如何实现链表的定义与反转功能的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 链表 定义 反转
    上一篇:关于PHP面向对象的事务脚本模式 下一篇:利用php爬取天猫和淘宝的商品数据
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 用PHP来统计在线人数的四个方法详解• 怎么获取新浪微薄分享成功的返回值 • 40个迹象表明你还是PHP初学者 • ThinkPHP单字母函数收拾 • 为什么小弟我新装zend9,导入后,原站的中文字体变小了
    1/1

    PHP中文网