PHP实现单链表翻转操作示例

本文实例讲述了PHP实现单链表翻转操作。分享给大家供大家参考,具体如下:

当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。

这里给出了一个单链表的定义及翻转操作方法:

<?php
/**
 * @file reverseLink.php
 * @author showersun
 * @date 2016/03/01 10:33:25
 **/
class Node{
  private $value;
  private $next;
  public function __construct($value=null){
    $this->value = $value;
  }
  public function getValue(){
    return $this->value;
  }
  public function setValue($value){
    $this->value = $value;
  }
  public function getNext(){
    return $this->next;
  }
  public function setNext($next){
    $this->next = $next;
  }
}
//遍历,将当前节点的下一个节点缓存后更改当前节点指针
function reverse($head){
  if($head == null){
    return $head;
  }
  $pre = $head;//注意:对象的赋值
  $cur = $head->getNext();
  $next = null;
  while($cur != null){
    $next = $cur->getNext();
    $cur->setNext($pre);
    $pre = $cur;
    $cur = $next;
  }
  //将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head
  $head->setNext(null);
  $head = $pre;
  return $head;
}
//递归,在反转当前节点之前先反转后续节点
function reverse2($head){
  if (null == $head || null == $head->getNext()) {
    return $head;
  }
  $reversedHead = reverse2($head->getNext());
  $head->getNext()->setNext($head);
  $head->setNext(null);
  return $reversedHead;
}
function test(){
  $head = new Node(0);
  $tmp = null;
  $cur = null;
  // 构造一个长度为10的链表,保存头节点对象head
  for($i=1;$i<10;$i++){
    $tmp = new Node($i);
    if($i == 1){
      $head->setNext($tmp);
    }else{
      $cur->setNext($tmp);
    }
    $cur = $tmp;
  }
  //print_r($head);exit;
  $tmpHead = $head;
  while($tmpHead != null){
    echo $tmpHead->getValue().' ';
    $tmpHead = $tmpHead->getNext();
  }
  echo "\n";
  //$head = reverse($head);
  $head = reverse2($head);
  while($head != null){
    echo $head->getValue().' ';
    $head = $head->getNext();
  }
}
test();
?>

运行结果:

0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • php链表用法实例分析

    本文实例讲述了php链表用法.分享给大家供大家参考.具体如下: 这里简单介绍了php链表的基本用法,包括链表节点的创建.遍历.更新等操作. <?php /** * @author MzXy * @copyright 2011 * @param PHP链表 */ /** * *节点类 */ class Node { private $Data;//节点数据 private $Next;//下一节点 public function setData($value){ $this->Data=$val

  • 浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区,栈区,全局区,常量区,代码区) 规定:基本数据类型,一般放在栈区 复合数据类型,比如对象,放在堆区 定义一个类Hero 定义成员属性排名 $no 定义成员属性姓名 $name 定义成员属性昵称 $nickname 定义成员属性 $next,是一个引用,指向下一个Hero对象 定义构造函数,传递参数:

  • php实现单链表的实例代码

    复制代码 代码如下: <?php //链表节点 class node {     public $id; //节点id     public $name; //节点名称     public $next; //下一节点 public function __construct($id, $name) {         $this->id = $id;         $this->name = $name;         $this->next = null;     } } /

  • PHP 双链表(SplDoublyLinkedList)简介和使用实例

    双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址. PHP SPL中的SplDoublyLinkedList类提供了对双链表的操作. SplDoublyLinkedList类摘要如下: SplDoublyLinkedList implements Iterator , ArrayAccess , Countable { public __construct ( void ) public void add ( mixed $index ,

  • PHP简单实现循环链表功能示例

    本文实例讲述了PHP简单实现循环链表功能.分享给大家供大家参考,具体如下: 概述: 循环链表是另一种形式的链式存贮结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环. 如下图所示: 实现代码: <?php class node{ public $data; public $link; public function __construct($data=null,$link=null){ $this->data=$data; $this->link=$link; } }

  • PHP实现双链表删除与插入节点的方法示例

    本文实例讲述了PHP实现双链表删除与插入节点的方法.分享给大家供大家参考,具体如下: 概述: 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 实现代码: <?php class node{ public $prev; public $next; public $data; public function __construct($data,$

  • php基于环形链表解决约瑟夫环问题示例

    本文实例讲述了php基于环形链表解决约瑟夫环问题.分享给大家供大家参考,具体如下: 先来重温一下约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1. 前面介绍了关联数组解决约瑟夫环的方法,环形链表解决约瑟夫环的方法如下: <?php header("content-type:text/html;charset=utf-8"); class Child{ public $no;

  • PHP实现的基于单向链表解决约瑟夫环问题示例

    本文实例讲述了PHP实现的基于单向链表解决约瑟夫环问题.分享给大家供大家参考,具体如下: 约瑟夫环问题:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越

  • PHP环形链表实现方法示例

    本文实例讲述了PHP环形链表实现方法.分享给大家供大家参考,具体如下: 环形链表是一种链式存储结构,类似于单链表.区别是环形链表的尾节点指向头节点. 从而形成一个环, 环形链表是一种非常灵活的存储结构,可解决许多实际问题,魔术师发牌问题和约瑟夫问题 都能利用环形链表来解决,下面是一个完整的环形链表实例,使用php来实现的(参照韩顺平老师的php算法教程) /** * 环形链表的实现 * */ class child { public $no;//序号 public $next;//指向下个节点的

  • PHP中模拟链表和链表的基本操作示例

    模拟链表: <?php /** * PHP实现链表的基本操作 */ class linkList { /** * 姓名 * @var string */ public $name = ''; /** * 编号 * @var int */ public $id = 0; /* * 引用下一个对象 */ public $next = null; /** * 构造函数初始化数据 * @param int $id * @param string $name */ public function __co

  • PHP小教程之实现双向链表

    看了很久数据结构但是没有怎么用过,在网上看到了关于PHP的数据结构,学习了一下,与大家一起分享一下.上一次分享了<PHP小教程之实现链表>,这次来补充说一下双向链表. 复制代码 代码如下: <?php        class Hero        {            public $pre=null;            public $no;            public $name;            public $next=null;           

随机推荐