PHP實現鍊錶

2022-03-12 19:36:41 字數 4185 閱讀 3674

目錄鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。

形式:單鏈表、雙鏈表、跳表(redis 集合資料結構就是跳表實現,時間複雜度o(log n))

跳表了解:

定義節點類:

<?php 

class node

}

鍊錶類:

<?php 

/**鍊錶

* class linklist

*/class linklist

//頭插法

public function addfirst( $value )

/**指定索引位置插入

* @param $index

* @param $value

* @throws exception

*/public function add( $index, $value )else

// $node = new node($value);

// $node->next = $prev->next;

// $prev->next = $node;

$prev->next = new node($value,$prev->next);

// }

$this->size++;

}/**尾插法

* @param $value

*/public function addlast( $value )

/***

* 編輯

* @param $index

* @param $value

* @throws exception

*/public function edit( $index, $value )

}/**

* 查詢

* @param $index

* @return null

* @throws exception

*/public function select($index)

}/**刪除

* @param $index

* @throws exceptionr

*/public function delete( $index )

$this->size--;

}/**檢索值是否存在

* @param $value

* @return bool

*/public function iscontain( $value )

$prev = $prev->next;

}return false;

}/**轉換為字串

* @return string

*/public function tostring()

return implode('->',$r);

}/**

* 刪除指定的節點值

* @param $value

*/public function removefileds( $value )else}}

/*** 通過遞迴方式刪除指定的節點值

* @param $value

*/public function removefiledsbyrecursion( $value )

public function removebyrecursion( $node , $value, $level=0 )

$this->showdeeep($level,$node->val);

$node->next = $this->removebyrecursion( $node->next,$value,++$level );

$this->showdeeep($level,$node->val);

return $node->val == $value ? $node->next:$node;

}/**

* 顯示深度

* 幫助理解遞迴執行過程,**函式執行層序遵循系統棧

* @param int $level 深度層級

* @param $val

* @return bool

*/public function showdeeep( $level=1,$val )

while($level--)

echo "$val\n";}}

呼叫操作如下:

<?php 

$node = new linklist();

$node->addfirst(1);

$node->add(1,7);

$node->add(2,10);

$node->edit(1,8);

var_dump($node->select(1)) ;

$node->delete(1);

$node->addlast(99);

var_dump($node->iscontain(2));

var_export($node);

var_export($node->tostring());

分析下鍊錶操作的時間複雜度:

增: o(n)  只對鍊表頭操作:o(1)

刪: o(n) 只對鍊表頭操作:o(1)

改:o(n)

查:o(n) 只對鍊表頭操作:o(1)

<?php 

/** * 鍊錶實現棧

* class linkliststack

*/class linkliststack extends linklist

/*** @return mixed

*/public function pop()

}

<?php 

$stack = new linkliststack();

$stack->push(1);

$stack->push(3);

$stack->push(6);

$stack->push(9);

print_r($stack->pop());

print_r($stack->head);

<?php 

/** * 鍊錶實現佇列

* class linklistqueue

*/class linklistqueue extends linklist

else

$this->size++;

}/**

* pop

* @return null

* @throws \exception

*/public function pop()

/*** 檢視隊首

*/public function checkhead()

/*** 檢視隊尾

*/public function checkend()

/*** tostring

*/public function tostring()

return implode('->',$r);}}

測試

<?php 

$stack = new linklistqueue();

$stack->push(1);

$stack->push(3);

$stack->push(6);

$stack->push(9);

print_r($stack->pop());

print_r($stack->head);

print_r($stack->checkhead());

print_r($stack->checkend());

print_r($stack->tostring());

/** 1(

[val] => 3

([val] => 6

([val] => 9

[next] =>

)))3

93->6->9

**/

PHP 實現鍊錶

設計鍊錶,鍊錶的每個節點都是乙個物件,每個節點都應具備乙個val和乙個next引用。鍊錶節點 class node 鍊錶 class mylinkedlist 獲取鍊錶的乙個節點,如果不存在或者大於鍊錶長度則返回 1 param integer index return integer functi...

php mysql 鍊錶 php如何實現鍊錶?

php實現鍊錶的方法 首先定義乙個節點類,為 function construct val null 然後實現鍊錶的實現類,為 function construct this dummyhead new nod php實現鍊錶的方法 首先定義乙個節點類class node public val pu...

php 實現鍊錶的排序

leetcode 148 排序乙個無序鍊錶 說明 1.通過快慢指標找到鍊錶的中間位置,low 表示右邊鍊錶 2.左邊鍊錶理解起來就比較費事了。左邊鍊錶 因為物件賦值是引用拷貝。所以,當 low 變化的時候,head 會記錄變化,通過 low next null 終止變化,得到左鍊錶。2.然後再通過有...