All about Linked List
From Hawk Wiki
Linked list
Create, to array, insert, inverse
<?php
//Everthing about linked list
//Create a List
class Node{
public $next=null;
public $prev=null;
public $val;
function __construct($v){
$this->val=$v;
}
function readNode(){
return $this->val;
}
}
class LinkList{
private $firstNode;
private $lastNode;
private $count;
function __construct(){
$this->firstNode=null;
$this->lastNode=null;
$this->count=0;
}
function isEmpty(){
return ($this->firstNode === NULL);
}
function insert($v){
if($this->isEmpty()){//insert first
$link = new Node($v);
$link->next = $this->firstNode;
$this->firstNode = &$link;
if($this->lastNode == NULL)
$this->lastNode = &$link;
}
else{//insert last
$link = new Node($v);
$this->lastNode->next = $link;
$link->next = NULL;
$this->lastNode = &$link;
}
$this->count++;
}
public function totalNodes(){
return $this->count;
}
public function readNode($nodePos){
if($nodePos < $this->count)
{
$current = $this->firstNode;
$pos = 0;
while($pos != $nodePos)
{
if($current->next == NULL)
return null;
else
$current = $current->next;
$pos++;
}
return $current->val;
}
else
return NULL;
}
public function readList()
{
$listData = array();
$current = $this->firstNode;
while($current != NULL)
{
array_push($listData, $current->val);
$current = $current->next;
}
return $listData;
}
public function reverseList(){
if($this->firstNode != NULL)
{
if($this->firstNode->next != NULL)
{
$current = $this->firstNode;
$new = NULL;
while ($current != NULL)
{
$next = $current->next;
$current->next = $new;
$new = $current;
$current = $next;
}
$this->firstNode = $new;
}
}
}
public function reverseList1(){
$prev=$this->firstNode;//first
$newLastNode=$this->firstNode;//construct new last node
$pos=$this->firstNode->next;//pos start from the second node
$newLastNode->next=null;
$next=null;
while($pos!=null){
$next=$pos->next;
$pos->next=$prev;
$prev=$pos;
$pos=$next;
}
// to the last node: $pos=$lastnode->next=null and $prev=$lastnode
$this->firstNode=$prev;
$this->lastNode=$newLastNode;
}
}
$ls=new LinkList(0);
for($i=0;$i<20;$i+=2){
$ls->insert($i);
}
$ls->reverseList1();
$lisrArray=$ls->readList();
var_dump($lisrArray);
?>