2014-02-13 3 views
0

Я учусь манипулировать узлами, и у меня проблема с одним из моих тестовых примеров, и, похоже, мой код не удаляет правильные узлы. Код должен удалять узлы, содержащие символы нижнего регистра, но когда тестовый пример ожидает E, я получаю l. Может ли кто-то просмотреть мой код и тестовый пример и объяснить, что не так. Я не могу использовать статические переменные, массивы или коллекции Java.код удаления неправильных узлов

мой код

public class ListUppercaseExample { 

    public static Node<Character> uppercase(Node<Character> head) { 
     if (head == null) { 
      return null; 
     } 
     Node<Character> prev = head; 
     Node<Character> start = head; 

     while (head != null) { 
      if (Character.isLowerCase(head.value)) { 
       if (Character.isLowerCase(start.value)) { 
        start = head.next; 
        prev = head.next; 
        head = head.next; 
       } else { 
        if(head.next == null){ 
         return start; 
        } 
        else{ 
         prev.next = head.next; 
         head = head.next; 
        } 
       } 
      } else { 
       head = head.next; 
      } 
     } 

     return start; 
    } 
} 

мой класс узел

public final class Node<T> { 
    public final T value; 
    public Node<T> next; 

    public Node(T _value) { 
     this(_value, null); 
    } 

    public Node(T _value, Node<T> _next) { 
     value = _value; 
     next = _next; 
    } 

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

тест

@Test 
public void testDrEvil() { 
    @SuppressWarnings("unchecked") 
    Node<Character>[] nodes = new Node[] { 
     new Node<Character>('d'), // 0 
     new Node<Character>('R'), // 1 
     new Node<Character>('E'), // 2 
     new Node<Character>('v'), // 3 
     new Node<Character>('I'), // 4 
     new Node<Character>('l', null) 
    }; 

    for (int i = 0; i < nodes.length-1; i++) { 
     nodes[ i ].next = nodes[ i+1 ]; 
    } 

    // expected: D -> R 
    Node<Character> actual = ListUppercaseExample.uppercase(nodes[0]); 
    Node<Character> now = actual; 
    assertEquals("", nodes[1], now); // R 
    assertEquals("", nodes[2], now.next); // E 
    now = now.next; 
    assertEquals("", nodes[4], now.next); // I 
    now = now.next; 
    assertEquals("", null, now.next); 
} 

ответ

2

У вас есть две проблемы:

  1. Вы не вынимая последнее значение в списке, если последнее значение в нижнем регистре из-за эту линию в ваше время цикла:

    if(head.next == null){ 
        return start; 
    } 
    

    Вы хотите, чтобы пропустить текущее значение head если это строчный регистр, будет ли следующее значение null или нет. Таким образом, вы можете просто удалить эту часть, если-заявление, так что ваш код выглядит так:

    if (Character.isLowerCase(start.value)) { 
        start = head.next; 
        prev = head.next; 
        head = head.next; 
    } else { 
        prev.next = head.next; 
        head = head.next; 
    } 
    
  2. Вы никогда не обновляя prev. Вам необходимо установить prev на номер head, если символ в верхнем регистре до вы изменяете значение head. Ваше другое заявление, если символ в верхнем регистре должен выглядеть , как например:

    } else { 
        prev = head; 
        head = head.next; 
    } 
    

После того, как эти изменения будут сделаны, в то время как ваш цикл должен выглядеть следующим образом:

while (head != null) { 
     if (Character.isLowerCase(head.value)) { 
      if (Character.isLowerCase(start.value)) { 
       start = head.next; 
       prev = head.next; 
       head = head.next; 
      } else { 
       prev.next = head.next; 
       head = head.next; 
      } 
     } else { 
      prev = head; 
      head = head.next; 
     } 
    } 
Смежные вопросы