2014-06-17 3 views
0

주제에 대한 몇 가지 질문이 있지만 여기서는 상황이 약간 다르다는 것을 알았습니다. 다른 질문은 Java linked-list 클래스를 다루지 만,이 클래스는 선생님으로부터 특정 속성이있는 사용자 정의 클래스입니다.연결된 목록의 특정 색인에서 개체를 삭제하는 방법은 무엇입니까?

그래서 'int'k '를 가져오고'k '색인에서 객체를 제거하고 제거 된 객체의'data '항목을 반환하는'removeAt '라는 메소드를 작성해야합니다.

내 문제는 개체를 찾은 후에 (기본적으로 다음 목록 노드에 대한 포인터를 제거합니다.) 일부 누락 된 특성이있는 것처럼 느껴지고 새로운 개체를 추가한다고 말하지 않았습니다. 당신이 이것을 달성하기 위해 제안 방법

public class ListNode { 

    Object data; 
    ListNode nextNode; 


    public ListNode(Object o){ 
     this(o,null); 
    } 
    public ListNode(Object o,ListNode node){ 
     data=o; 
     nextNode=node; 
    } 
    public Object getObject(){ 
     return data; 
    } 
    public ListNode getNext(){ 
     return nextNode; 
    } 

} 

:

public class List { 

    private ListNode firstNode; 
    private ListNode lastNode; 
    private String name; 


    public List() 
    { 
     this("list"); 
    } 


    public List(String listName) 
    { 
     name=listName; 
     firstNode=lastNode=null; 
    } 


    //override 
    public String toString() 
    { 
     String stringToReturn = ""; 

     ListNode currentNode = firstNode; 

     while (currentNode != null) { 

      stringToReturn += currentNode.toString(); 
      currentNode = currentNode.getNext(); 

      if (currentNode != null) { 
       stringToReturn += ", "; 
      } 
     } 
     return stringToReturn; 
    } 


    public Object removeAt(int k) throws ListIndexOutOfBound 
    { 
     ListNode removedNode = this.firstNode; 
     Object removedObject; 
     int idx = 0; 

     if (isEmpty()) 
      throw new EmptyListException(this.name); 

     if (k < 0) 
      throw new ListIndexOutOfBound(); 

     if (k == 0) { 
      removedObject = this.removeFromFront(); 
     } else { 

      while (idx != k) { 
       removedNode = removedNode.getNext(); 
       idx++; 

       if (removedNode == null) 
        throw new ListIndexOutOfBound(); 
      } 

      if (removedNode == this.lastNode) { 
       removedNode = (ListNode) this.removeFromBack(); 
      } else { 
       removedObject = removedNode.data; 
       //i'm stuck here...I want to remove this node from the list! 

      } 
     } 
     return removedNode; 
    } 

이처럼 보이는 ListNode 클래스가 :

이 내 코드?

+0

자바 그래서 그냥 당신의 좋은에 대한 모든 참조를 제거 GC 있습니다. 그러나 모든 항목이 리프가 아닌 것은 아닙니다. IOW, 당신은 1-2-3을 다루어야 만합니다. 어디에서 제거하고 싶은지 2. 그것에 대해 생각해보십시오. 또한 제네릭을 사용하지 않는 이유를 선생님에게 물어보십시오. – ChiefTwoPencils

+0

어떻게 참조를 제거합니까? 이것은 내 질문 @ChiefTwoPencils – Joe

답변

1

내가 항상 원하는 노드를 제거한 후 다음 노드를 설정하기 위해 제거 할 노드 전에 노드를 기억하는 당신을 제안 :

if (k == 0) { 
     removedObject = this.removeFromFront(); 
    } else { 

     ListNode prev = null; 

     while (idx != k) { 
      prev = removedNode; 
      removedNode = removedNode.getNext(); 
      idx++; 

      if (removedNode == null) 
       throw new ListIndexOutOfBound(); 
     } 

     if (removedNode == this.lastNode) { 
      removedNode = (ListNode) this.removeFromBack(); 
     } else { 
      removedObject = removedNode.data; 
      prev.setNext(removedNode.getNext()); 
     } 
    } 

당신이 방법 setNext(ListNode next)을 추가해야 할 것입니다 의미 ListNode 개체. 이 removedNode.getNext()

|    | prev.getNext()  | removedNode.getNext() | 
-------------------------------------------------------------------- 
| prev   | removedNode  | <any node> or null  | 

이후에 prevnextNode을 설정하는 것입니다 무엇을

public void setNext(ListNode next){ 
     nextNode = next; 
    } 

:

|    | prev.nextNode() | (<any node>.nextNode())? | 
-------------------------------------------------------------------- 
| prev   | <any node> or null | ...      | 
+0

이지만 ListNode에서 'nextNode'라는 속성이 있으므로 'prev.nextNode = removedNode.getNext;'라고 말할 수는 없습니다. ? @StefanFalk 새로운 메소드를 만드는 대신에 – Joe

+0

'public'이라면 그렇게 할 수 있습니다. 이 경우'setNode (ListNode next) '메소드가 필요 없다. – displayname

+0

감사합니다! @StefanFalk – Joe

관련 문제