2.判斷鍊錶是否有環
這篇檔案主要通過學習鍊錶的翻轉
和判斷鍊錶是否有環
這兩個簡單的例子加深對鍊錶這種資料結構的理解。
1.1 鍊錶翻轉原理圖
1.2 鍊錶翻轉**
<?php
require 'linkedlist.php';
$linkedlist = new linkedlist();
for ($i = 1;$i <= 20;$i++)
echo $linkedlist->tostring();
/** * 20->19->18->17->16->15->14->13->12->11->10->9->8->7->6->5->4->3->2->1->null
*/echo "\n";
function reverse($head)
$head->next = null;
return $pre;
}$linkedlist->sethead(reverse($linkedlist->gethead()));
echo $linkedlist->tostring();
/** * 1->2->3->4->5->6->7->8->9->10->11->12->13->14->15->16->17->18->19->20->null
*/echo "\n";
演示輸出如下圖:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-xnmwarlg-1607591730558)(/uploads/sjjghsf/images/m_aaa1fe689fa688efe41cba4d2d3a6cea_r.png)]
2.1 鍊錶環示意圖
2.2 問題分析
在遍歷鍊錶的時候可以維護快
和慢
兩個指標賦值,可以將這兩個快慢插設為1
,當遍歷到環上面的時候,由於維護的兩個指標的快慢相差1
,最後肯定會有相遇的時候,若出現相遇的情況則表示有環,若快指標最後指向null
表示沒有環。
2.3 原理圖
2.4 示例**
<?php
class node
}function isloop($head)
$fast = $fast->next->next ?? null; //每次跳兩步
$slow = $slow->next ?? null; //每次跳一步
if($i)
$i++;
}return false;
}$node1 = new node(1);
$node2 = new node(2);
$node3 = new node(3);
$node4 = new node(4);
$node5 = new node(5);
$node6 = new node(6);
$node7 = new node(7);
$node8 = new node(8);
$node9 = new node(9);
$node1->next = $node2;
$node2->next = $node3;
$node3->next = $node4;
$node4->next = $node5;
$node5->next = $node6;
$node6->next = $node7;
$node7->next = $node8;
$node8->next = $node9;
$node9->next = $node5;
var_dump(isloop($node1));
演示輸出如下圖:
**倉庫 :
掃碼關注愛因詩賢
資料結構69 鍊錶逆置,鍊錶反轉,鍊錶翻轉
鍊錶翻轉,簡單地理解,就是將鍊錶的頭部結點變為鍊錶的尾部結點,與此同時將原鍊錶的尾部結點變成頭部結點。如下圖所示 圖 1 鍊錶翻轉示意圖 將鍊錶進行翻轉的方法有多種,本節給大家介紹兩種實現方法。實現鍊錶翻轉最直接的方法就是 從鍊錶的頭部開始遍歷每個結點,改變每個結點的指向,即將原本指向下乙個結點的指...
Python資料結構之翻轉鍊錶
翻轉乙個鍊錶 樣例 給出乙個鍊錶1 2 3 null,這個翻轉後的鍊錶為3 2 1 null 一種比較簡單的方法是用 摘除法 就是先新建乙個空節點,然後遍歷整個鍊錶,依次令遍歷到的節點指向新建鍊錶的頭節點。那樣例來說,步驟是這樣的 1.新建空節點 none 2.1 none 3.2zmaqmauon...
PHP資料結構之 鍊錶
鍊錶是一種在邏輯上連續 有序的資料儲存結構 在物理儲存單元上非連續非有序 在我大學的時候,學習c 的資料結構課程時,最先接觸的就是鍊錶 大學是學渣別噴.那麼鍊錶是怎樣的一種結構呢?用 形象的 文本來描述就是 node 1 node 2 node 3 node 4 node n 每乙個node包含一些...