Создание связанного списка в Java - PullRequest
0 голосов
/ 19 января 2012

Это пример из моей книги.Насколько я понимаю, когда вы создаете список с этим классом, вы создаете два объекта (first и last, которые являются нулевыми).Я не могу понять, почему, когда вы помещаете первый и последний объекты "Node" в метод add.Не должно ли это создавать два элемента, когда вы устанавливаете first = n и last = n.Например, если я позвоню list.add(2), не должны ли оба first и last быть 2 сейчас?

public class List {

    private Node   first = null;
    private Node   last = null;

    public List(){
        first = null;
        last = null;

    }   

    private static class Node{

        public int   value;
        public Node   next;

        public Node ( int value, Node next){
            this.value = value;
            this.next = next;       
        }
    }   

    public void add (int value){
        Node   n = new Node (value,null);

        if(first==null){
            first = n;
            last = n;

        }else{
            last.next = n;
            last = n;
        }
    }

    public int size(){
        int   number = 0;
        Node   n = first;
        while(n != null){
            number++;
            n = n.next;
        }
        return number;
    }
}

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Как я вижу, когда вы создаете список с этим классом, вы создаете два объекта (первый и последний, которые являются нулевыми).

Это не правда. first и last не являются объектами, но ссылается на на объекты. И в этом случае они начинаются как null ссылок, что означает, что они вообще не ссылаются ни на один объект.

Когда вы пишете first = n; last = n;, вы устанавливаете first и last, чтобы оба ссылались на один и тот же объект & mdash; к какому объекту n относится.

Например, если list.add (2), теперь не должно быть и первым, и последним 2?

Да, они оба будут ссылаться на один и тот же экземпляр Node, чей value равен 2.

0 голосов
/ 19 января 2012

Да, я вижу, что нужны первые и последние.Возможно, позже первое будет гораздо полезнее, если у вас есть очередь (сначала удалить) или поиск (который, я думаю, можно выполнить с конца, а не с самого начала, тот же процесс для простого линейного поиска).

По вашему вопросу.Да, если вы начали с пустого списка и сказали list.add (2).Первый и последний будут указывать на узел со значением 2. Это связано с тем, что первый элемент и последний элемент в списке совпадают, следовательно, 1 элемент в списке.Это и первое и последнее (и среднее, если вы хотите быть странным).

, но если вы сделали list.add (1), list.add (2).Вы получите first = node.value == 1 и second = node.value == 2

...