2016-08-04 24 views
1

Folgende ist meine Klassendefinition in seiner einfachsten Form -Wie unterscheidet man "nur einen anderen Knoten" mit demselben Wert vom Wurzelknoten einer verknüpften Liste, während geprüft wird, ob die Liste kreisförmig ist oder nicht?

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

Es folgt, wie ich zwei verkettete Listen bin Initialisierung -

//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(); 

Folgende ist meine Ausgabe -

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 

Ich hatte erwartet, dass ich falsch zurückkehren würde.

Allerdings funktioniert dies laut meiner Erwartung -

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

Was bin ich?

Antwort

1

Hier ist Ihr Problem. Sie nannten es mit $ll statt $ll2:

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

ah, ich fühle mich wieder in einer Grube wie versteckt: D –