2014-09-23 5 views
1

그래서 처음부터 링크 된 목록을 구현했으며 현재 노드 (커서)를 제거하려고합니다. 프로그램을 실행하고 현재 노드를 제거하려고하면 오류가 발생하지 않지만 현재 노드 (다음 노드 나 이전 노드 여야 함)를 인쇄하려고 시도하고 ' 제거되었습니다.자바 - 수동 연결 목록, 현재 노드 제거

+0

여기에 인스턴스 변수 커서가 코드를 :) 형식을 Mac에서 Windows에서 Ctrl-Shift-F 또는 Cmd-Shift-F를 사용할 수있는 Eclipse를 사용하는 경우

를? 문제를 일으키는 것은 여러 번 지정하고 있습니다. – mkobit

+0

현재 노드를 삭제 한 후'cursor'는 어느 노드를 가리 킵니까? 이전 노드 또는 다음 노드? 당신은이 행동을 정의해야만합니다. –

답변

1

나는,

cursor = cursor.getPrev().getNext(); 

에 전화 아무것도하지 않는 (가정 커서가 삭제할 목록의 요소가) 의심스러운 해요 이미 cursor해야 == cursor.getPrev().getNext()

로 나는 당신이 원하는 의심 무엇

cursor.getPrev().setNext(cursor.getNext()); // note SET instead of GET 
cursor.getNext().setPrev(cursor.getPrev()); 
3

전나무입니다 이 부분에서

// get previous node and set its next to node after cursor 
cursor.getPrev().setNext(cursor.getNext()); 

: 당신은 아마 커서를 가리키는에서 이전 노드의 연결을 해제하고 커서 후 노드를 가리 만들고 싶었다

// ... 
}else{ 
    cursor = cursor.getPrev().getNext(); // THIS LINE - all you say here is 'cursor = cursor' 
    cursor = cursor.getNext(); 
} 
// ... 

: 모든 t,이 라인은 이해되지 않는다

if(cursor.getNext() == null){ //it's the tail 
    tail = cursor.getPrev(); 
} 

당신은 내가를 업데이트 한 후 그래서 당신의 tail.nextcursor를 가리 킵니다 tail.next = null을 말함으로써 tail.next을 분리하지 티.

그리고이 라인 :

// get next node and set its prev to node before cursor 
cursor.getNext().setPrev(cursor.getPrev()); 

전반적으로, 당신의 논리는 그것이 있어야 다음 복잡하게 더 많은 것 같다 같은

else{ 
    cursor = cursor.getNext().getPrev(); // again no effect 
    cursor = cursor.getPrev(); 
} 

이 보일 것입니다. 코드를 단순화하지만 논리를 변경하지 않는 한 가지 방법은 다음과 같습니다 (커서 노드 사용)

if 문을 약간 재정렬하면 더 명확 해집니다. 커서가 중간 노드에있는 때 ambigous 상황이 있기 때문에 내가 커서의 업데이트를 남겨

if (cursor != null){ 
    if(cursor.getPrev() == null){ //it's the head 
      head = cursor.getNext(); 
      head.setPrev(null); // disconnect the head from current node 
    } else if (cursor.getNext() == null) { // it's the tail 
      tail = cursor.getPrev(); 
      tail.setNext(null); // disconnect the tail from current node 
    } else { // regular node 
      Node prev = cursor.getPrev(); 
      prev.setNext(next); // connect previous node to next node 
      Node next = cursor.getNext(); 
      next.setPrev(prev); // connect next node to previous node 

    } 
    // this part isn't necessary because we are skipping the cursor node 
    // so nothing in the list references to it anymore 
    // however it is a good safety measure and it helps the GC a bit 
    cursor.setPrev(null); // disconnect cursor from previous node 
    cursor.setNext(null; // disconnect cursor from next node 
} 

당신은 그것을 제거 : 그런 다음 나머지 가장자리의 경우 첫 번째 (머리와 꼬리)를 확인해야합니다. 문제는 커서를 prev 또는 next으로 어떻게 업데이트하겠습니까?

커서가 실제로 필요하지 않지만 이미이 대답이 많이 정체되어 있으므로 this linkthis link을 사용하여 좋은 아이디어를 확인해 보겠습니다.

지금까지 당신의 긴 인쇄 포맷으로 : 당신이, 당신은 자동으로

+0

AH 제 세터 메소드들입니다. 고맙습니다! 링크를 주셔서 감사합니다. –

+0

@ user3076352 문제 없음 :) – nem035