2015-01-31 1 views
0
void deleteEven() { 
     boolean con = false; 
     Node add; 
     Node move; 
     move = head; 
     if (move.data % 2 == 0) { 
      head = move.next; 
      con = true; 
     } 
     add = move; 
     move = move.next; 
     while (move != null) { 
      if (move.data % 2 == 0) { 
       add.next = move.next; 
       con = true; 
      } 
      add = move; 
      move = move.next; 
     } 
     if (!con) 
      System.out.println("No even numbers in list"); 
    } 

꼬리를 제외한 모든 노드에서 작동합니다. 연결된 목록이 [5,4,3,2,2] 인 경우 결과는 [5,3,2] 어떻게 해결할 수 있습니까?꼬리 노드에서 작동하지 않는 연결된 목록에서 짝수를 제거 하시겠습니까?

답변

1

문제는하지입니다 꼬리 노드. 문제는 목록에있는 위치와 관계없이 두 개의 짝수 행을 연속적으로 사용하는 경우입니다. 현재 노드가 짝수 일 때 포인터를 이전 노드 (add)로 이동하면 방금 제거했지만 현재 노드로 이동합니다. 두 번째 짝수 노드의 경우 add.next = move.next 문은 방금 제거한 노드에 대해 next으로 변경됩니다.

가장 간단한 해결책은 노드도없는 경우에만 add을 이동하는 것입니다 : 당신은 꽤하여 코드를 단순화 할 수

if (move.data % 2 == 1) { 
    add.next = move.next; 
    con = true; 
} else { 
    add = move.next; 
} 

전부 add 제거하고 단지 move 앞서 하나 개의 노드를 찾고하기 :

while (move.next != null) { 
    if (move.next.data % 2 == 0) { 
     move.next = move.next.next; 
     con = true; 
    } else { 
     move = move.next; 
    } 
} 

프로그래밍 팁 : 문제를 진단하기 전에 몇 가지 테스트 사례가 있습니다. 적은 수의 테스트 케이스를 기반으로 잘못된 결론으로 ​​넘어 가기 쉽고 범위를 확장하면 문제가 더 명확 해집니다. 이는 테스트 주도 개발이 제대로 작동하는 이유 중 하나입니다.

0

다른 노드를 연결하기위한 서비스 노드를 만들어 보겠습니다.

그런 다음 목록을 반복하고 새 목록에 대한 참조를 복사 (새 노드가 생성되지 않음) :

void deleteEven() { 
    Node tmpHead = new Node(0, null); 
    Node tmpCopy = tmpHead; 
    Node tmp = head; 
    while (tmp != null) { 
     if (tmp.data % 2 == 1) { 
      tmpCopy.next = tmp; 
      tmpCopy = tmpCopy.next; 
     } 
     tmp = tmp.next; 
    } 
    tmpCopy.next = null; 
    head = tmpHead.next; 
} 

는 노드는 무엇인가 가정하자 :

class Node { 
    int data; 
    Node next; 

    public Node(int data, Node next) { 
     this.data = data; 
     this.next = next; 
    } 
} 
관련 문제