Что такое вставка в связанный список - PullRequest
1 голос
/ 20 июня 2020

У меня проблемы с пониманием того, как вставлять в связанный список. Я нашел несколько примеров в Интернете, но, похоже, не могу понять их на 100%. В этом коде я добавил комментарии о том, что, по моему мнению, происходит в код, а также то, с чем я борюсь. Некоторая помощь будет признательна. Спасибо!

    private static final class Node {
        final Person person;
        Node next;

        Node(Person person) {
            this.person = person;
        }
    }

   public boolean insert(Person person) {
        Node n = new Node(person);
        //insert as the first element
        if (head == null) {
            head = n;
            size++;
            return true;
        }

        Node current = head;
        Node prev = null;
        int comparison;

        while (current != null) {
            //until the list is empty compare 
            comparison = person.name.compareTo(current.person.name);
            //that person already exists
            if (comparison == 0) {
                return false;
            } else if (comparison > 0) { 
                //if the next spot in the list is empty place the person there
                if (current.next == null) { 
                    current.next = n;
                    break;
                }
            } else { 
            //this is the part I dont understand
                if (prev == null) { 
                    Node oldHead = head;
                    head = n;
                    head.next = oldHead;
                    break;
                }
                //dont understand this either
                prev.next = n;
                n.next = current;
                break;
            }
            //keep moving through the list
            prev = current;
            current = current.next;
        }
        size++;
        return true;
    }

1 Ответ

0 голосов
/ 20 июня 2020

На основании всех сравнений, которые вы выполняете в коде, кажется, что это отсортированный связанный список, а не обычный связанный список.

Этот фрагмент кода говорит, что если значение вставлено меньше заголовка, мы хотим, чтобы это новое значение было заголовком, а исходное значение заголовком было вторым значением в списке. Следовательно, oldHead - это ссылочная переменная для заголовка только для временного хранения значения. После этого head = n просто устанавливает заголовок (он же первый узел в списке) на новый узел, поэтому теперь вставляется первый узел. Затем head.next = oldHead устанавливает следующее значение в списке, равное исходному заголовку списка. Теперь вставленное значение стоит первым в списке, а исходный заголовок - вторым значением в списке.

if (prev == null) { 
        Node oldHead = head;
        head = n;
        head.next = oldHead;
        break;
}

Этот фрагмент кода просто устанавливает связи, чтобы все переменные были связаны вместе.

//dont understand this either
prev.next = n;
n.next = current;
break;
...