java - ऑब्जेक्ट युक्त नोड्स के लिए स्टैक कार्यान्वयन



linked-list stack (1)

मेरे पास Nodes के Nodes हैं जिनमें पूर्णांक ऑब्जेक्ट शामिल हैं I

LinkedList listOfInts = new LinkedList();

और मैं Objects जोड़ता हूं;

list.add(new Integer(8));
list.add(new Integer(5));
list.add(new Integer(3));
list.add(new Integer(4));

निम्न Node वर्ग के साथ:

class Node {

 private Object data;
 private Node next;

 public Node(Object data) 
 {
   this.data = data;
   this.next = next;
 }

 public Object getData() 
 {
   return data;
 }

 public Node getNext() 
 {
   return next;
 }

 public void setNext(Node next) 
 {
   this.next = next;
 }
}

अगर मैं ऐसा कुछ करता हूं;

Node p = listOfInts.pop()

और फिर डेटा प्रिंट करें,

System.out.println(p.getData());

मुझे सही जवाब मिलता है: 8

लेकिन अगर मैं एक नया LinkedList पर इस नंबर को पुश करना चाहता हूं;

LinkedList newStack = new LinkedList();
newStack.push(p);

यह पूरी सूची धक्का देता है, न सिर्फ पहले डेटा बिंदु, 8

 [8,5,3,4];

मेरा सवाल ये है कि ऐसा क्यों होता है? चूंकि यह एक ऐसी बुनियादी समस्या है, मुझे लगता है कि इसे मेरे push() और pop() तरीके से करना है, लेकिन जब से मैंने उन्हें उन पाठ्य पुस्तकों में लिखा है, मुझे नहीं पता कि उनके साथ क्या गलत है। क्या कोई मेरी मदद कर सकता है?

public Node pop()
{
  Node item = peek(); //save item to return

  if(!isEmpty())
  {
    first = first.getNext(); //delete first node
  }
  size--;
  return item; //return first saved item
}

public void push(Node item)
{
  Node next = item.getNext();
  next = first;
  first = item;
  size++;

}

public Node peek()
{
  if (isEmpty())
  {
    System.out.println("Error: No element");
  }
  return first;
}

संपादित करें: Nodes बजाय ऑब्जेक्ट्स लौटने का सुझाव दिया गया था, और push() विधि को छोड़कर कोड कम या ज्यादा है। इसलिए, जब मैं उसी LinkedList में एक और ऑब्जेक्ट जोड़ने का प्रयास करता हूं, तो यह सूची में जोड़ने के बजाय पुराने को बदल देता है।

 //push node on top of the stack
 public void push(Object item)
 {

   Node newNode = new Node(item);
   Node next = newNode.getNext();
   next = first;
   first = newNode;

   size++;
  }//push

आपका कार्यान्वयन pop के नाम पर Node ऑब्जेक्ट वापस कर रहा है, लेकिन Node अभी भी मूल स्टैक में "अगला" स्थिति का संदर्भ है।

जब आप एक नया स्टैक बनाते हैं, और आप पॉप किए गए आइटम को पुश करते हैं, मूल Node ऑब्जेक्ट सवारी के लिए साथ में है, इसकी मूल next संदर्भ के साथ।

listOfInts -----> { 5 } -> { 3 } -> { 4 }
                    ^
newStack  -> { 8 } -+

यही कारण है कि पूरी सूची नई स्टैक पर दिखाई देती है।

समाधान Node ऑब्जेक्ट को बिल्कुल भी प्रदर्शित नहीं करना है। Node को स्वीकार करने के बजाय, डेटा आइटम को स्वीकार करें, और अपना स्वयं का Node बनाएं। pop और Node में एक Node लौटने के बजाय, Node से डेटा आइटम निकालें और इसे वापस करें। इस तरह से आप अनजाने में अगले Node के संदर्भ को वांछित नोड में लीक करने का जोखिम नहीं उठाते हैं।





stack