2013-12-10 4 views
1

두 배로 링크 된 목록을 실행할 때마다 목록의 뒤에서 제거 할 때를 제외하고 모든 방법이 작동합니다. 나는 4, 3, 9였던 목록을 가지고 있었다. 나는 앞쪽에서 제거했다. 그런 다음이 메서드를 호출하여 9를 제거해야했습니다. 대신 DL 목록을 호출 할 때 null (3도 제거함)을 반환합니다. 도와주세요. (; 생성 된 코드는 문제에 대한 필요가 없습니다, 그래서 우리는 그것을 작성하지 않은 .. 즉, 노드는 중요하지 않습니다 후 물건 인터페이스를 확장) 여기 이중 연결 목록 Java 뒤에서 지우기

public Object removeLast() { 
    Object result = null; 

    if (!isEmpty()) { 
     result = lastNode.getData(); 
     lastNode = lastNode.getPreviousNode(); 

     if (lastNode == null) 
      firstNode = null; 
     else 
      lastNode.setNextNode(null); 
    } 
    return result; 
} 

코드의 나머지 부분입니다 정확한 코드 : 어쩌면 누락 --numberOfEntries이 있지만

public class DList implements DoubleEndedListInterface { 

    public Node lastNode; 
    public Node firstNode; // reference to first node 
    public int numberOfEntries; 

    @Override 
    public String toString() { 
     return "" + firstNode; 

    } 

    public Node getNodeAt(int givenPosition) { 
     assert !isEmpty() && (1 <= givenPosition) 
       && (givenPosition <= numberOfEntries); 
     Node currentNode = firstNode; 

     // traverse the list to locate the desired node 
     for (int counter = 1; counter < givenPosition; counter++) 
      currentNode = currentNode.getNextNode(); 

     assert currentNode != null; 

     return currentNode; 
    } // end getNodeAt 

    public void addFirst(Object newEntry) { 
     Node newNode = new Node(newEntry); 

     if (firstNode == null) 
     { 
      firstNode = newNode; 
      lastNode = newNode; 
      numberOfEntries++; 
     } 
     else 
     { 
      newNode.setNextNode(firstNode); 
      firstNode.setPreviousNode(newNode); 
      firstNode = newNode; 
      numberOfEntries++; 
     } // end if 
    } // end add 


    public void addLast(Object newEntry) { 
     Node newNode = new Node(newEntry); 

     if (firstNode == null) 
     { 
      firstNode = newNode; 
      //lastNode = newNode; 
      numberOfEntries++; 
     } 
     else 
     { 
      lastNode.setNextNode(newNode); 
      lastNode = newNode; 
      numberOfEntries++; 
     } // end if 
    } // end add 

    @Override 
    public Object removeFirst() { 
     Object result = firstNode.getData(); 
     firstNode = firstNode.getNextNode(); 
     if (numberOfEntries == 1) 
      lastNode = null; // solitary entry was removed 

     numberOfEntries--; 

     return result; // return removed entry, or 
         // null if operation fails 
    } // end remove 

    @Override 
    public Object removeLast() { 
     Object result = null; 

     if (!isEmpty()) { 
      result = lastNode.getData(); 
      lastNode = lastNode.getPreviousNode(); 

      if (lastNode == null) 
       firstNode = null; 
      else 
       lastNode.setNextNode(null); 
     } 
     return result; 
    } 

    @Override 
    public Object getFirst() { 
     // TODO Auto-generated method stub 
     return firstNode.getData(); 
    } 

    @Override 
    public Object getLast() { 
     // TODO Auto-generated method stub 
     return lastNode.getData(); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void moveToEnd() { 
     Object temp = (Object) remove(1); 
     add(numberOfEntries + 1, temp); 

    } 

    public class Node { 
     public Object data; // entry in bag 
     public Node next; // link to next node 
     public Node previous; 

     public Node(Object dataPortion) { 
      this(dataPortion, null, null); 
     } // end constructor 

     public Node(Object dataPortion, Node nextNode, Node previousNode) { 
      data = dataPortion; 
      next = nextNode; 
      previous = previousNode; 
     } // end constructor 

     public Object getData() { 
      return data; 
     } // end getData 

     public void setData(Object newData) { 
      data = newData; 
     } // end setData 

     public Node getNextNode() { 
      return next; 
     } // end getNextNode 

     public Node getPreviousNode() { 
      return previous; 
     } 

     public void setPreviousNode(Node previous) { 
      this.previous = previous; 
     } 

     public void setNextNode(Node nextNode) { 
      next = nextNode; 
     } // end setNextNode 

     @Override 
     public String toString() { 
      return "Node [data=" + data + ", next=" + next + "]"; 
     } 

    } // end Node 

    @Override 
    public void add(Object newEntry) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean add(int newPosition, Object newEntry) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Object remove(int givenPosition) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void clear() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean replace(int givenPosition, Object newEntry) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Object getEntry(int givenPosition) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean contains(Object anEntry) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public int getLength() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean isEmpty() { 
     boolean result; 

     if (numberOfEntries == 0) // or getLength() == 0 
     { 
      assert firstNode == null; 
      result = true; 
     } else { 
      assert firstNode != null; 
      result = false; 
     } // end if 

     return result; 
    } // end isEmpty 

    @Override 
    public void swap(int i, int j) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean isTooBig() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void reduceArray() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Object[] toArray() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void makeRoom(int newPosition) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void removeGap(int givenPosition) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean removeObject(Object anObject) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public int getPosition(Object anObject) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void append(ListInterface bList) { 
     // TODO Auto-generated method stub 

    } 
} 
+1

두 번째 호출이 아닌 처음 위치에서'removeLast'를 호출하면 어떻게됩니까? 또한 제대로 도움이되는 충분한 코드가 여기에 없습니다 ... 코드 디버깅을 쉽게하기 위해 나머지 코드를 게시 하시겠습니까? – abiessu

+1

코드가 정상적으로 작동하는 이유를 잘 모르겠지만 더 많은 코드를 제공하면 구현시 오류를 식별하는 데 도움이 될 수 있습니다. 또한 @abiessu는 무언가에있을 수 있습니다. 마지막으로 호출하지 않고 처음 호출 할 때 어떤 일이 발생하는지 알려 주어야합니다. – Pandacoder

+1

내 돈이'lastNode'를 제대로 설정하지 않았습니다. 코드가 많으면 잘못 될 수 있습니다. – kviiri

답변

0

removeLast는 완벽 의미가 있습니다. 내가 읽지 않은 나머지 코드는 너무 많습니다.

그러나 add은 이상합니다. 로컬 변수 lastNode을 사용하여 일부 필드 lastNode을 사용하지 않는 것처럼 보입니다.

0

여기에 내가 볼 수있는 작업은 다음과 같습니다

addFirst가 좋아 보인다,이 방법이 제대로 작동해야합니다 것처럼 나타납니다.

addLast이 맞지 않습니다. 특히 노드가 addLast을 통해 빈 목록에 추가되는 경우 lastNode 멤버 변수는 유효한 값을 가지지 않습니다.

그런 다음 모두 removeFirstremoveLast 특히 빈 목록하여 numberOfEntries 멤버의 처리 및 수행 수표, 도움이 필요합니다.

"list begins empty"조건의 경우, "다음"및 "이전"포인터를 null로 설정하여 표유 데이터 간섭을 일으키지 않도록해야합니다.