Найти прописные буквы в списке ссылок и вернуть новый список ссылок с найденными элементами?

1

Я должен написать метод, который будет искать связанный список (ListNode, соединяя один символ в список), находить все символы верхнего регистра, копировать их в новый ListNode и возвращать новый ListNode. Это мой код до сих пор, но он не прошел тестирование JUnit (предоставлено профессором).

Это узел списка:

public class ListNode {
    public char element;
    public ListNode next;

}

И это метод, который написал ive, который, похоже, не работает:

 public static ListNode copyUpperCase(ListNode head) {

    ListNode newListNode = mkEmpty();
    if(head == null){
        throw new ListsException("Lists: null passed to copyUpperCase");
    }else{
        char[] sss = toString(head).toCharArray();
        for(int i = 0; i < sss.length ; i++ )
                if(Character.isUpperCase(sss[i])){
                    newListNode.element = sss[i];       
                }
                newListNode = newListNode.next;
        }           
    return newListNode;
}

Что происходит с кодом? Почему это терпит неудачу?

Теги:
list
algorithm
linked-list

2 ответа

2
Лучший ответ

Расширяясь в ответ @enterbios (+1 для него), попробуйте следующее:

public static ListNode toUpperCase(ListNode head) {
    if (head == null)
        throw new ListsException("Lists: null passed to copyUpperCase");

    ListNode newHead = null;
    ListNode current = null;

    char[] sss = toString(head).toCharArray();

    for (int i=0; i<sss.length; i++) {
        if (Character.isUpperCase(sss[i])) {
            if (current == null) {
                current = mkEmpty();
                newHead = current;
            } else {
                current.next = mkEmpty();
                current = current.next;
            }
            current.element = sss[i];
        }
    }
    return newHead;

}
2

Вам нужно создать newListNode.next где-нибудь. Я не вижу его в предоставленном фрагменте кода. Попробуйте изменить свой метод:

 public static ListNode copyUpperCase(ListNode head) {

    ListNode newListNode = mkEmpty(); 
    ListNode newHead = newListNode;   //KEEP HEAD OF NEW LINKED LIST
    if(head == null){
        throw new ListsException("Lists: null passed to copyUpperCase");
    }else{
        char[] sss = toString(head).toCharArray();
        for(int i = 0; i < sss.length ; i++ )
            if(Character.isUpperCase(sss[i])){
                newListNode.element = sss[i];
                newListNode.next = mkEmpty();   //CREATE NEW INSTANCES INSIDE LOOP
                newListNode = newListNode.next; //MOVING FORWARD TO NEXT NODE, newListNode is the last node of new linked list
            }
    }
    return newHead;
}
  • 0
    В качестве меры предосторожности это приведет к пустому узлу в конце вашего списка. (Я не знаю, если это проблема или нет, просто хотел бы указать на это)
  • 0
    «XabIdRXA7pX», это строка, которая будет превращена в элемент char в ListNode. После запуска метода copyUpperCase он возвращает только «RA». Разве это не должно возвращать "XIRXAX"? Почему это?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню