【问题标题】:How to implement doubly linked list in PHP?如何在 PHP 中实现双向链表?
【发布时间】:2011-12-12 03:21:41
【问题描述】:

我周五收到了一个面试问题,我想我没及格。问题是:

在 PHP 中编写一个处理双链表的类。

我理解这个概念,这是我给出的代码:

class element {
 private $current;
 public function __construct($e) {
  $this->current = $e;
 }
 // method
 // etc..
}

class doublelist
{
  private $prev;
  private $next;
  private $current;
  private $list;
  public function add(element $e) {
   if($this->current == NULL) {
    $this->prev = $this->current;
   }
   $this->current = $e;
  }
}

$list = new doublelist();
$list->add(new element('a'));
$list->add(new element('b'));

这最初有效,但如果我添加第二个元素,我会“丢失”第一个元素,我不明白为什么。

【问题讨论】:

  • element 应该有 prevnext 指针,而不是 list

标签: php linked-list


【解决方案1】:

您需要跟踪elements 上的$prev$next,而不是列表。如果你想让它变得透明,你可以将每个 element 包装在一个 bean 中,该 bean 具有指向下一个和前一个的指针,或者只是让 element 具有这些定义。

按照您现在的操作方式,列表只会知道哪个是当前的element,以及哪个是之前的。但是您真正应该做的是从element(或bean)中找出哪个是下一个或上一个。

编辑

由于这个问题偶尔出现,我想我会添加一些代码来帮助更好地解释这个问题。

class DoublyLinkedList {
    private $start = null;
    private $end = null;

    public function add(Element $element) {
        //if this is the first element we've added, we need to set the start
        //and end to this one element
        if($this->start === null) {
            $this->start = $element;
            $this->end = $element;
            return;
        }

        //there were elements already, so we need to point the end of our list
        //to this new element and make the new one the end
        $this->end->setNext($element);
        $element->setPrevious($this->end);
        $this->end = $element;
    }

    public function getStart() {
        return $this->start;
    }

    public function getEnd() {
        return $this->end;
    }
}

class Element {
    private $prev;
    private $next;
    private $data;

    public function __construct($data) {
        $this->data = $data;
    }

    public function setPrevious(Element $element) {
        $this->prev = $element;
    }

    public function setNext(Element $element) {
        $this->next = $element;
    }

    public function setData($data) {
        $this->data = $data;
    }
}

当然,您还可以添加其他方法;如果有人对这些感兴趣,我也可以添加它们。

【讨论】:

    【解决方案2】:

    在编写任何代码之前,告诉他们它已经完成并且包含在 PHP 标准库中。 http://php.net/manual/en/class.spldoublylinkedlist.php


    此外,您的 add 函数不应包含元素。它应该只是 $list->add('a'); 你暴露你的实现太多了。

    【讨论】:

    • 我知道这个问题更多的是关于技能,但我会在编写代码之前诚实地告诉雇主。我对此有足够的意见,可以将其发布为答案。
    猜你喜欢
    • 2012-05-10
    • 2019-11-23
    • 2021-11-18
    • 2011-06-03
    • 2015-05-16
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多