2011-12-12 17 views
8

मुझे शुक्रवार को एक साक्षात्कार प्रश्न मिला और मुझे लगता है कि मैंने इसे फंसाया। सवाल था:PHP में दोगुनी लिंक्ड सूची को कैसे कार्यान्वित करें?

एक कक्षा लिखें जो PHP में एक डबल लिंक्ड सूची को संसाधित करती है।

मैं अवधारणा को समझने, और यहाँ कोड मैं दे दिया है:

class element { 
private $current; 
public function __construct($e) { 
    $this->current = $e; 
} 
// method 
// etc.. 
} 

class doublelist 
{ 
    private $prev; 
    private $next; 
    private $current; 
    private $list; 
    public function add(element $e) { 
    if($this->current == NULL) { 
    $this->prev = $this->current; 
    } 
    $this->current = $e; 
    } 
} 

$list = new doublelist(); 
$list->add(new element('a')); 
$list->add(new element('b')); 

यह शुरू में काम करता है, लेकिन मैं पहले एक "हार" अगर मैं एक दूसरा तत्व जोड़ सकते हैं और मुझे समझ नहीं आता क्यूं कर।

+3

'तत्व' में' prev' और 'next' पॉइंटर्स होना चाहिए, न कि' सूची '। – Jon

उत्तर

12

आपको और $nextelement एस पर, सूची में नहीं रखने की आवश्यकता है। यदि आप इसे पारदर्शी बनाना चाहते हैं, तो आप प्रत्येक element को एक बीन में लपेट सकते हैं जिसमें पॉइंटर्स अगले और पिछले वाले हैं, या केवल element को परिभाषा के अनुसार बनाएं।

जिस तरह से आप इसे अभी कर रहे हैं, सूची केवल यह जानती है कि वर्तमान element कौन सा है, और कौन सा इससे पहले आया था। लेकिन आपको वास्तव में क्या करना चाहिए element (या बीन) से यह पता लगाना है कि कौन सा अगला या पिछला होगा।

संपादित

के बाद से यह सवाल कभी देखने मिल रही हैं, मुझे लगता है मैं इस बेहतर समझने में सहायता मिलेगी एक छोटे से कोड जोड़ना होगा सोचा।

class DoublyLinkedList { 
    private $start = null; 
    private $end = null; 

    public function add(Element $element) { 
     //if this is the first element we've added, we need to set the start 
     //and end to this one element 
     if($this->start === null) { 
      $this->start = $element); 
      $this->end = $element; 
      return; 
     } 

     //there were elements already, so we need to point the end of our list 
     //to this new element and make the new one the end 
     $this->end->setNext($element); 
     $element->setPrevious($this->end); 
     $this->end = $element; 
    } 

    public function getStart() { 
     return $this->start; 
    } 

    public function getEnd() { 
     return $this->end; 
    } 
} 

class Element { 
    private $prev; 
    private $next; 
    private $data; 

    public __construct($data) { 
     $this->data = $data; 
    } 

    public function setPrevious(Element $element) { 
     $this->prev = $element; 
    } 

    public function setNext(Element $element) { 
     $this->next = $element; 
    } 

    public function setData($data) { 
     $this->data = $data; 
    } 
} 

बेशक, अन्य विधियां जो आप जोड़ सकते हैं; और यदि कोई उन लोगों में रूचि रखता है तो मैं उन्हें भी जोड़ सकता हूं।

+1

ओह, अब मैं देख रहा हूं कि मैंने इसे क्यों फंसाया, आपके उत्तर –

2

सही उत्तर है: क्षमा करें, नहीं। यह पहले से ही किया जा चुका है और PHP मानक पुस्तकालय में शामिल है। http://php.net/manual/en/class.spldoublylinkedlist.php


इसके अलावा, अपने ऐड समारोह एक तत्व नहीं लेना चाहिए। यह सिर्फ $list->add('a'); होना चाहिए आप अपना कार्यान्वयन बहुत अधिक कर रहे हैं।

+0

के लिए धन्यवाद, मैं समझता हूं कि सवाल कौशल के बारे में अधिक है, लेकिन मैं ईमानदारी से किसी चीज़ को कोड करने से पहले नियोक्ता को बता दूंगा। मुझे लगता है कि इसे उत्तर के रूप में पोस्ट करने के लिए इसके बारे में पर्याप्त राय है। –

संबंधित मुद्दे