<?php

class LinkedListObject {
 
 public $previous;
 public $next;
 public $data;

 /* Initialization of linked list object */
 public function __construct() {
   $this->previous = 0;
   $this->next = NULL;
   $this->data = NULL;   
 }   
}

class LinkedList extends LinkedListObject {
 public $len;
 public $head; 
 public $tail;

 /* Initialization of linked list */
 public function __construct() {
   $this->len = 0;
   $this->head = NULL;
   $this->tail = NULL;   
 }
}

function linked_list_create() {   
 
 $ll = new LinkedList;
   
 return $ll;
}

function linked_list_object_create() {

 $ll_object = new LinkedListObject;
   
 return $ll_object;

}

function linked_list_append(&$ll, $item) {

 $appendant = linked_list_object_create();
 $appendant->data = $item;
 $appendant->previous = $ll->tail;
 $appendant->next = NULL;

  if($ll->head == NULL) {
   $ll->head = & $appendant;
 }

  $ll->tail->next = $appendant;
 
  $ll->tail = $appendant;
 
 /* Additional node with length plus one */
 $ll->len++;

 unset($ll);

}

function linked_list_len($ll) {
  return $ll->len;
}

$ll = linked_list_create();

for($num = 1; $num <= 10; $num++) {
  linked_list_append($ll, $num);
}
$tmp = $ll->tail;

while(1) {   
  printf("%d\n", $tmp->data);
  
  if($tmp->previous != NULL) {
    $tmp = $tmp->previous;
  } else {
    break;
  } 
}
printf("%d\n", $tmp->data);
unset($tmp);
printf("%d\n", $tmp->data);

printf("%d", $ll->tail->data);
 
?>