php链表笔记:单链表反转

<?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();

猜你喜欢

转载自www.cnblogs.com/mrszhou/p/10053307.html