2013-04-18 4 views
-3

링크 된 목록을 사용하여 스택을 구현해야하는 클래스를 작성해야합니다. 그러나 머리 대신 목록의 꼬리 부분에서 푸시 및 팝 작업을 수행해야합니다. 또한 목록의 꼬리 노드에 대한 참조를 유지하면 안됩니다.링크 된 라이브러리에서의 스택 작업

마지막 노드에 대한 참조를 유지하지 않고 어떻게 지구에서 이것을 할 수 있습니까 ??

+2

당신은 항상 꼬리에 목록을 통과 할 수 있습니다. 마지막 노드에 대한 참조를 유지하지 않는 것이 가장 효율적일지라도. – Ankit

+0

대기열이라고합니다. 그리고 그래, 매번 목록을 그냥 지나치는거야. –

+0

머리가 무엇이고 꼬리가 무엇인지에 대해 혼란 스럽다고 생각합니다. – noMAD

답변

0

이렇게 할 수 있지만 무언가를하고 싶을 때마다 전체 목록을 검토해야하기 때문에 꽤 비효율적입니다. 모든 작업이 꼬리에서 수행되는 동안 헤드에 대한 참조를 유지하려는 이유는 실제로 없습니다. 여기

그러나 나는 어쨌든 그것을 할 것입니다 방법은 다음과 같습니다

class Entry<E> { 
    E object; 
    Entry<E> next; 
    public Entry(E obj) { 
     object = obj; 
    } 
} 

class StackList<E> { 
    Entry<E> head; 
    public void push(E element) { 
     if (head == null) { 
      // first 
      head = new Entry<E>(element); 
      return; 
     } 
     Entry<E> node = head; 
     while (node != null && node.next != null) { 
      node = node.next; 
     } 
     // node is now the tail 
     Entry<E> newEntry = new Entry<E>(element); 
     node.next = newEntry; 
    } 
    public E pop() { 
     if (head == null) { 
      // empty 
      return null; 
     } 
     Entry<E> node = head, previousNode = null; 
     while (node.next != null) { 
      previousNode = node; 
      node = node.next; 
     } 
     // node is now the tail 
     // previousNode is the next-to-last 
     if (previousNode != null) { 
      previousNode.next = null; 
     } else { 
      // there was only one thing 
      head = null; 
     } 
     return node.object; 
    } 
} 
관련 문제