作为程序员一定要保持良好的睡眠,才能好编程

PHP实现一个单向链式循环列表

发布时间:2018-11-27

定义类


class Node {
  public $id;
  public $name;
  public $next;

  public function __construct($id, $name) {

    $this->id = $id;
    $this->name = $name;
    $this->next = NULL;
  }
}

/**
 * 链表中有两个特别重要的方法,插入和删除
 *
 * 插入需要找到插入的位置,把前一个元素的next指针指向被插入的节点,并将被插入极端点的next指针指向后一个节点
 *
 * 而删除则把前一个节点的next指针指向后一个节点,并返回被删除元素的数据内容。
 *
 *
 */
class SimpleWhile {

  private $header;

  public function __construct($node = NULL) {
    if (is_null($node))
      $this->header = NULL;
    else {
      $node->next = $node;
      $this->header = $node;
    }
  }

  /**
   * 获取链式列表中的数据的个数
   * @return int
   */
  public function getLinkLength() {

    if ($this->is_empty())
      return 0;

    $count = 1;
    $current = $this->header;
    while ($current->next != $this->header) {
      $count++;
      $current = $current->next;
    }

    return $count;

  }

  /**
   * 在循环列表中某一个位置插入代码
   * @param $id
   * @param $node
   */
  public function insert($id, $node) {

    if ($this->is_empty()) {
      $node->next = $node;
      $this->header = $node;
    }

    /**
     * 插入到了第一位
     */
    if ($id === 1) {

      $next = $this->header;
      $node->next = $next;

      $current = $this->header;
      while ($current->next != $this->header) {
        $current = $current->next;
      }

      $this->header = $node;
      $current->next = $this->header;

      return;
    }


    $count = 1; //如果while条件成立,这就是第一个

    $current = $this->header;
    $found = FALSE;
    while ($current->next != $this->header) {

      if ($count === $id) {
        $found = TRUE;
        break;
      }

      $count++;
      $current = $current->next;
    }

    //找到了位置
    if ($found) {
      $node->next = $current->next;
      $current->next = $node;
    } else {
      //$this->addLink($node); 这样的添加是有顺序的不能使用。

      $node->next = $this->header;
      $current->next = $node;

    }

  }

  /**
   *
   * 向里面添加一个元素,
   * 元素添加,是根据id自动进行排序链表的
   *
   *
   *
   *
   * @param $node
   */
  public function addLink($node) {

    if ($this->is_empty()) {
      $node->next = $node;
      $this->header = $node;
    } else {

      $current = $this->header;

      //如果相等,就是一个元素
      if ($current->next == $this->header) {
        if (($current->id > $node->id)) {
          $current->next = $node;
          $node->next = $current;
          $this->header = $node;
          return;
        }
      }

      $islast = TRUE;//判断是不是最后一个
      $isfirst = TRUE;
      $changeHeader = FALSE;
      //如果$current->next 是null  就退退出while循环
      while ($current->next != $this->header) {

        if (($current->next->id > $node->id) || ($changeHeader = ($current->id > $node->id) && $isfirst)) {
          $islast = FALSE;
          break;
        }

        $isfirst && $isfirst = FALSE; //只有第一次循环的时候,才会执行

        $current = $current->next;
      }
      //如果定义一个有序的列表,这里返回的不是最后一个,因此$node不应该指向最后一个。
      if ($changeHeader) {
        $current->next = $node;
        $node->next = $current;
        $this->header = $node;
      } else {
        $node->next = $islast ? $this->header : $current->next;
        $current->next = $node;
      }

    }
  }


  /**
   * 删除一个id的链表,
   * 这里需要着重说一说,怎么删除
   *
   * 删除时,需要知道  删除元素的上一个元素是谁
   *
   * 删除元素的下一个元素是谁,
   *
   * 这两个元素需要做一个对接
   *
   * 这样就能保证 链式列表不断链。
   * @param $id
   */
  public function delLink($id) {

    if ($this->is_empty())
      return;

    $current = $this->header;

    //删除第一个
    if ($current->id === $id) {
      $next = $current->next;
      while ($current->next != $this->header) {
        $current = $current->next;
      }
      $this->header = $next;
      $current->next = $this->header;
      return TRUE;
    }


    $islast = TRUE;
    $find = FALSE;
    while ($current->next != $this->header) {

      if ($current->next->id == $id) {
        $islast = FALSE;
        $find = TRUE;
        break;
      }
      $current = $current->next;
    }

    //$current->next = $current->next->next;

    if (!$find && $current->id === $id)
      $find = TRUE;

    if ($find) {
      $islast ? $current->next = $this->header : $current->next = $current->next->next;
      return TRUE;
    } else
      return FALSE;

  }

  /**
   * 判断链式列表是否为空
   * @return bool
   */
  public function is_empty() {
    return is_null($this->header) ? TRUE : FALSE;
  }


  /**
   * 根据id获取到对应的name 或者叫 value
   * @param $id
   * @return string
   */

  public function getLinkNameById($id) {


    if ($this->is_empty())
      return '';


    $current = $this->header;

    if ($current->id === $id) {
      return $current->name;
    }

    while ($current->next != $this->header) {

      if ($current->id === $id) {

        break;
      }

      $current = $current->next;
    }

    if ($current->id === $id) {
      return $current->name;
    }

    return '';
  }


  /**
   * 更新指定id中的name
   * @param $id
   * @param $name
   * @return bool
   */
  public function updateLink($id, $name) {

    $current = $this->header;

    if ($current->id === $id) {
      $current->name = $name;
      return TRUE;
    }

    while ($current->next != $this->header) {

      if ($current->id == $id) {
        break;
      }

      $current = $current->next;
    }

    if ($current->id === $id) {
      $current->name = $name;
      return TRUE;
    }


    return FALSE;
  }


  /**
   * 获取整个链式列表,并以链式的方式返回
   * @return array
   */
  public function getLinkList() {
    if ($this->is_empty())
      return [];

    $current = $this->header;
    $data = [$current];
    while ($current->next != $this->header) {
      $data[] = $current->next;
      $current = $current->next;
    }

    return $data;
  }


  /**
   * 获取整个链式列表中的数据
   * @return array
   */
  public function getData() {
    if ($this->is_empty())
      return [];

    $current = $obj = $this->header;
    $data = [['id' => $obj->id, 'name' => $obj->name]];
    while ($current->next != $this->header) {
      $_obj = $current->next;
      $data[] = ['id' => $_obj->id, 'name' => $_obj->name];
      $current = $current->next;
    }
    return $data;
  }

}



项目调用:

$linkList = new SimpleWhile();


//$linkList->addLink(new Node(1, 'james'));

$linkList->addLink(new Node(4, 'jon'));

$linkList->addLink(new Node(3, 'shiree'));

$linkList->addLink(new Node(8, 'james'));

$linkList->addLink(new Node(2, 'james'));

$linkList->addLink(new Node(7, 'jim'));


var_dump($linkList->getLinkLength());


print_r($linkList->getData());

print_r($linkList->getLinkList());



//
//print_r($linkList->getData());
//
//var_dump($linkList->updateLink(3, 'jon123'));
//

//
//
//
//var_dump($linkList->getLinkNameById(3));
//
//var_dump($linkList->getLinkNameById(8));
//
//


print_r($linkList->getData());

//var_dump($linkList->delLink(1));
//var_dump($linkList->delLink(2));

//print_r($linkList->getLinkList());
var_dump($linkList->getLinkLength());


$linkList->insert(10, new Node(0, 'head'));

print_r($linkList->getData());

var_dump($linkList->getLinkLength());

$linkList->updateLink(3, '123123');

echo $linkList->getLinkNameById(3);

$data=$linkList->getLinkList();
print_r($data);
var_dump($linkList->getLinkLength());


$linkList->delLink(3);
var_dump($linkList->getLinkLength());
$data = $linkList->getLinkList();
print_r($data);

$data=$linkList->getLinkList();



结果展示:

int(5)
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => shiree
        )

    [1] => Array
        (
            [id] => 2
            [name] => james
        )

    [2] => Array
        (
            [id] => 4
            [name] => jon
        )

    [3] => Array
        (
            [id] => 7
            [name] => jim
        )

    [4] => Array
        (
            [id] => 8
            [name] => james
        )

)

D:\phpStudy\WWW\test>php simpleWhile.php
D:\phpStudy\WWW\test\simpleWhile.php:371:
int(5)
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => shiree
        )

    [1] => Array
        (
            [id] => 2
            [name] => james
        )

    [2] => Array
        (
            [id] => 4
            [name] => jon
        )

    [3] => Array
        (
            [id] => 7
            [name] => jim
        )

    [4] => Array
        (
            [id] => 8
            [name] => james
        )

)
Array
(
    [0] => Node Object
        (
            [id] => 3
            [name] => shiree
            [next] => Node Object
                (
                    [id] => 2
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 4
                            [name] => jon
                            [next] => Node Object
                                (
                                    [id] => 7
                                    [name] => jim
                                    [next] => Node Object
                                        (
                                            [id] => 8
                                            [name] => james
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [1] => Node Object
        (
            [id] => 2
            [name] => james
            [next] => Node Object
                (
                    [id] => 4
                    [name] => jon
                    [next] => Node Object
                        (
                            [id] => 7
                            [name] => jim
                            [next] => Node Object
                                (
                                    [id] => 8
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 3
                                            [name] => shiree
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [2] => Node Object
        (
            [id] => 4
            [name] => jon
            [next] => Node Object
                (
                    [id] => 7
                    [name] => jim
                    [next] => Node Object
                        (
                            [id] => 8
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 3
                                    [name] => shiree
                                    [next] => Node Object
                                        (
                                            [id] => 2
                                            [name] => james
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [3] => Node Object
        (
            [id] => 7
            [name] => jim
            [next] => Node Object
                (
                    [id] => 8
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 3
                            [name] => shiree
                            [next] => Node Object
                                (
                                    [id] => 2
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 4
                                            [name] => jon
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [4] => Node Object
        (
            [id] => 8
            [name] => james
            [next] => Node Object
                (
                    [id] => 3
                    [name] => shiree
                    [next] => Node Object
                        (
                            [id] => 2
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 4
                                    [name] => jon
                                    [next] => Node Object
                                        (
                                            [id] => 7
                                            [name] => jim
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

)
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => shiree
        )

    [1] => Array
        (
            [id] => 2
            [name] => james
        )

    [2] => Array
        (
            [id] => 4
            [name] => jon
        )

    [3] => Array
        (
            [id] => 7
            [name] => jim
        )

    [4] => Array
        (
            [id] => 8
            [name] => james
        )

)
D:\phpStudy\WWW\test\simpleWhile.php:402:
int(5)
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => shiree
        )

    [1] => Array
        (
            [id] => 2
            [name] => james
        )

    [2] => Array
        (
            [id] => 4
            [name] => jon
        )

    [3] => Array
        (
            [id] => 7
            [name] => jim
        )

    [4] => Array
        (
            [id] => 8
            [name] => james
        )

    [5] => Array
        (
            [id] => 0
            [name] => head
        )

)
D:\phpStudy\WWW\test\simpleWhile.php:409:
int(6)
123123Array
(
    [0] => Node Object
        (
            [id] => 3
            [name] => 123123
            [next] => Node Object
                (
                    [id] => 2
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 4
                            [name] => jon
                            [next] => Node Object
                                (
                                    [id] => 7
                                    [name] => jim
                                    [next] => Node Object
                                        (
                                            [id] => 8
                                            [name] => james
                                            [next] => Node Object
                                                (
                                                    [id] => 0
                                                    [name] => head
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

    [1] => Node Object
        (
            [id] => 2
            [name] => james
            [next] => Node Object
                (
                    [id] => 4
                    [name] => jon
                    [next] => Node Object
                        (
                            [id] => 7
                            [name] => jim
                            [next] => Node Object
                                (
                                    [id] => 8
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 0
                                            [name] => head
                                            [next] => Node Object
                                                (
                                                    [id] => 3
                                                    [name] => 123123
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

    [2] => Node Object
        (
            [id] => 4
            [name] => jon
            [next] => Node Object
                (
                    [id] => 7
                    [name] => jim
                    [next] => Node Object
                        (
                            [id] => 8
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 0
                                    [name] => head
                                    [next] => Node Object
                                        (
                                            [id] => 3
                                            [name] => 123123
                                            [next] => Node Object
                                                (
                                                    [id] => 2
                                                    [name] => james
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

    [3] => Node Object
        (
            [id] => 7
            [name] => jim
            [next] => Node Object
                (
                    [id] => 8
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 0
                            [name] => head
                            [next] => Node Object
                                (
                                    [id] => 3
                                    [name] => 123123
                                    [next] => Node Object
                                        (
                                            [id] => 2
                                            [name] => james
                                            [next] => Node Object
                                                (
                                                    [id] => 4
                                                    [name] => jon
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

    [4] => Node Object
        (
            [id] => 8
            [name] => james
            [next] => Node Object
                (
                    [id] => 0
                    [name] => head
                    [next] => Node Object
                        (
                            [id] => 3
                            [name] => 123123
                            [next] => Node Object
                                (
                                    [id] => 2
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 4
                                            [name] => jon
                                            [next] => Node Object
                                                (
                                                    [id] => 7
                                                    [name] => jim
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

    [5] => Node Object
        (
            [id] => 0
            [name] => head
            [next] => Node Object
                (
                    [id] => 3
                    [name] => 123123
                    [next] => Node Object
                        (
                            [id] => 2
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 4
                                    [name] => jon
                                    [next] => Node Object
                                        (
                                            [id] => 7
                                            [name] => jim
                                            [next] => Node Object
                                                (
                                                    [id] => 8
                                                    [name] => james
                                                    [next] => Node Object
 *RECURSION*
                                                )

                                        )

                                )

                        )

                )

        )

)
D:\phpStudy\WWW\test\simpleWhile.php:417:
int(6)
D:\phpStudy\WWW\test\simpleWhile.php:421:
int(5)
Array
(
    [0] => Node Object
        (
            [id] => 2
            [name] => james
            [next] => Node Object
                (
                    [id] => 4
                    [name] => jon
                    [next] => Node Object
                        (
                            [id] => 7
                            [name] => jim
                            [next] => Node Object
                                (
                                    [id] => 8
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 0
                                            [name] => head
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [1] => Node Object
        (
            [id] => 4
            [name] => jon
            [next] => Node Object
                (
                    [id] => 7
                    [name] => jim
                    [next] => Node Object
                        (
                            [id] => 8
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 0
                                    [name] => head
                                    [next] => Node Object
                                        (
                                            [id] => 2
                                            [name] => james
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [2] => Node Object
        (
            [id] => 7
            [name] => jim
            [next] => Node Object
                (
                    [id] => 8
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 0
                            [name] => head
                            [next] => Node Object
                                (
                                    [id] => 2
                                    [name] => james
                                    [next] => Node Object
                                        (
                                            [id] => 4
                                            [name] => jon
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [3] => Node Object
        (
            [id] => 8
            [name] => james
            [next] => Node Object
                (
                    [id] => 0
                    [name] => head
                    [next] => Node Object
                        (
                            [id] => 2
                            [name] => james
                            [next] => Node Object
                                (
                                    [id] => 4
                                    [name] => jon
                                    [next] => Node Object
                                        (
                                            [id] => 7
                                            [name] => jim
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

    [4] => Node Object
        (
            [id] => 0
            [name] => head
            [next] => Node Object
                (
                    [id] => 2
                    [name] => james
                    [next] => Node Object
                        (
                            [id] => 4
                            [name] => jon
                            [next] => Node Object
                                (
                                    [id] => 7
                                    [name] => jim
                                    [next] => Node Object
                                        (
                                            [id] => 8
                                            [name] => james
                                            [next] => Node Object
 *RECURSION*
                                        )

                                )

                        )

                )

        )

)