<?php
/**
* Created by PhpStorm.
* User: huizhou
* Date: 2018/12/1
* Time: 11:41
*/ /**
* 1.链表的反转
* Class Node
*/
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(Node $head){ if($head == null){
return $head;
} $pre = $head; // 取出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(Node $head){
if($head == null || $head->getNext() == null){
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;
} $tmpHead = $head;
while ($tmpHead != null){
echo $tmpHead->getValue();
$tmpHead = $tmpHead->getNext();
} echo "\n"; $head = reverse2($head); while ($head != null ){
echo $head->getValue();
$head = $head->getNext();
}
} test();