如何区分“;只是另一个节点“;在检查列表是否循环时,从链表的根节点使用相同的值


How to differentiate "just another node" with same value from the root node of a linked list while checking if the list is circlular or not?

下面是我最简单形式的类定义-

class Node
{
    public $data;
    public $next = null;
    public function __construct($data)
    {
        $this->data  = $data;
    }
}
class LinkedList
{
    public $root;
//should have named checkIfCircular
    public function checkIfCyclic()
    {
        $rootVal = $this->root->data;
        $isCyclic = false;
        //start iterating from the root, through the length of the ll and see if the root is encountered again.
        $node = $this->root;
        while($node->next!=null)
        {
            echo "<br>traversing ".$node->next->data." comparison ".($node->next === $this->root)." and ".($node->next == $this->root);
            //case 2 -> strict comparison does not differentiate as expected here. Evaluates to true even in case of $ll2.
            if($node->next === $this->root) 
            {
                $isCyclic = true;
                break;
            }
            else
            {
                $node=$node->next;
            }
        }
        return $isCyclic;
    }
}

以下是我如何初始化两个链表-

//3->4->5->6->first node
$ll = new LinkedList();
$ll->root = new Node(3);
$ll->root->next = new Node(4);
$ll->root->next->next = new Node(5);
$ll->root->next->next->next = new Node(6);
$ll->root->next->next->next->next = $ll->root;
echo "<br>see ll ".$ll->checkIfCyclic();

//3->4->5->6->3 (a different 3) 
$ll2 = new LinkedList();
$ll2->root = new Node(3);
$ll2->root->next = new Node(4);
$ll2->root->next->next = new Node(5);
$ll2->root->next->next->next = new Node(6);
$ll2->root->next->next->next->next = new Node(3);
echo "<br>see ll2 ".$ll->checkIfCyclic();

以下是我的输出-

traversing 4 comparison and
traversing 5 comparison and
traversing 6 comparison and
traversing 3 comparison 1 and 1
see ll 1
traversing 4 comparison and
traversing 5 comparison and
traversing 6 comparison and
traversing 3 comparison 1 and 1 //I expected the 1st comparison to return false here
see ll2 1

我本以为ll2会返回false

然而,这符合我的期望-

$something = new Node(3);
$another = $something;
echo "compare same ".($something===$another)." and ".($something==$another)."<br>"; 
$something = new Node(3);
$another = new Node(3);
echo "compare different ".($something===$another)." and ".($something==$another)."<br>"; 

我错过了什么?

这是您的问题。你用$ll而不是$ll2:来称呼它

echo "<br>see ll2 ".$ll->checkIfCyclic();