Удалить узел в связанном списке, не удаляя соответствующий узел - PullRequest
0 голосов
/ 26 июня 2018

Я начал свою основу для этого вопроса здесь, и мне сказали начать новую тему: Удалить элементы в связанном списке

Я закончил мой код ниже:

public class MyLinked {
    static class Node {
        public Node (double item, Node next) { this.item = item; 
this.next = next; }
        public double item;
        public Node next;
        } 
    int N;
    Node first;
public void delete (int k) {
        if (k < 0 || k >= N) throw new IllegalArgumentException ();

        if (k == 0) {
            Node temp = first;
            first = first.next;
            temp.next = null;
        }else { 
            Node previous = first;
            while (k < N -1) {
                previous = previous.next;
                k++;
            }

        Node current = previous.next;
        previous.next = current.next;
        current.next = null;
        N--;
        }
    }

Я думаю, что я указываю на правильные узлы для удаления k-го элемента, однако вот что возвращает тест:

[ 11 21 31 41 ].delete( 0 ): Expected 4 nodes, but got less.
[ 11 21 31 41 ].delete( 1 ): expected=[ 11 31 41 ], actual=[ 11 21 31 ]
[ 11 21 31 41 ].delete( 3 ): expected=[ 11 21 31 ], actual=[ 11 31 41 ]
[ 11 21 31 41 51 ].delete( 0 ): Expected 5 nodes, but got less.
[ 11 21 31 41 51 ].delete( 1 ): expected=[ 11 31 41 51 ], actual=[ 11 21 31 41 ]
[ 11 21 31 41 51 ].delete( 2 ): expected=[ 11 21 41 51 ], actual=[ 11 21 31 51 ]
[ 11 21 31 41 51 ].delete( 3 ): expected=[ 11 21 31 51 ], actual=[ 11 21 41 51 ]
[ 11 21 31 41 51 ].delete( 4 ): expected=[ 11 21 31 41 ], actual=[ 11 31 41 51 ]

Я думаю, что ошибка в том, что когда он пытаетсяудалить [0], он удаляется в [1], когда [1] в [2].Я представляю, что он начинается с [1] вместо [0] как первый узел в списке?Любая помощь по настройке моего кода для правильного чтения очень ценится.

Вот тестовый код:

 private static void testDelete (int k, String list, String expected) {
        MyLinked actual = MyLinked.of (list);
        String message = String.format ("[ %s ].delete( %d )", list, 
k);
        try {
            actual.delete (k);
        } catch (Throwable e) {
            String exception = e.getClass ().getName ();
            if (! exception.equals (expected)) {
                e.printStackTrace (); // for debugging
                showError (String.format ("%s: expected=%s, 
actual=%s", message, expected, exception));
            }
            return;
        }
        check (message, actual, expected);
    }

1 Ответ

0 голосов
/ 26 июня 2018

Я смог настроить свой код и получил правильный ответ.Рабочий код приведен ниже:

    public void delete (int k) {
        if (k < 0 || k >= N) throw new IllegalArgumentException ();

        if (k == 0) {
            Node temp = first;
            first = first.next;
            temp.next = null;
            N--;
        }
        else {  
            Node previous = first;
            int count = 0;
            while (count < k-1) {
                previous = previous.next;
                count++;
            }

        Node current = previous.next;
        previous.next = current.next;
        current.next = null;
    N--;
        }
   }

Я добавил в int count и установил счетчик, чтобы он начинался с 0. Когда у меня он начинался с 1, именно поэтому он удалял неправильное значение.

Мне также нужно было добавить N-- в (k == 0) часть функции, чтобы изменить размер списка, если список содержит только один элемент, и этот элемент был удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...