Как различить «просто еще один узел» с тем же значением из корневого узла связанного списка при проверке, является ли список кольцевым или нет?

Следующее — мое определение класса в его самой простой форме —

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>";

Что мне не хватает?

1

Решение

Вот твоя проблема. Вы назвали это с $ll вместо $ll2:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]