Не могу понять блок кода в реализации LinkedList

213
04 февраля 2020, 01:40

Дана реализация связанного списка:

class Link {
    public int data1;
    public double data2;
    public Link nextLink;
    //Link constructor
    public Link(int d1, double d2) {
        data1 = d1;
        data2 = d2;
    }
    //Print Link data
    public void printLink() {
        System.out.print("{" + data1 + ", " + data2 + "} ");
    }
}
class LinkList {
    private Link first;
    //LinkList constructor
    public LinkList() {
        first = null;
    }
    //Returns true if list is empty
    public boolean isEmpty() {
        return first == null;
    }
    //Inserts a new Link at the first of the list
    public void insert(int d1, double d2) {
        Link link = new Link(d1, d2);
        link.nextLink = first;
        first = link;
    }
    //Deletes the link at the first of the list
    public Link delete() {
        Link temp = first;
        if(first == null){
            return null;
            //throw new NoSuchElementException(); // this is the better way.
        }
        first = first.nextLink;
        return temp;
    }
    //Prints list data
    public void printList() {
        Link currentLink = first;
        System.out.print("List: ");
        while(currentLink != null) {
            currentLink.printLink();
            currentLink = currentLink.nextLink;
        }
        System.out.println("");
    }
}
class LinkListTest {
    public static void main(String[] args) {
        LinkList list = new LinkList();
        list.insert(1, 1.01);
        list.insert(2, 2.02);
        list.insert(3, 3.03);
        list.insert(4, 4.04);
        list.insert(5, 5.05);
        list.printList();

    }
}

Не могу понять метод

public void insert(int d1, double d2) {
        Link link = new Link(d1, d2);
        link.nextLink = first;
        first = link;
    }

И его вызов list.insert В теле метода сохраняется ссылка на вновь созданный объект в first. При повторном вызове метода ссылка переписывается. Где сохраняется предыдущий элемент?

Answer 1

Можно разобрать этот пример более детально, чтобы понять, что происходит, например, так

1) LinkList list = new LinkList(); 

Выделили место под LinkList и внутри объекта у нас объявляются поля
private Link first;

2) list.insert(1, 1.01);

Здесь происходит

2.1)    Link link = new Link(d1, d2);
2.2)    link.nextLink = first;
2.3)    first = link;

2.1 - создание нового объекта Link Также внутри этого объекта создаются поля public int data1; public double data2; public Link nextLink; И сразу происходит заполнение data1,data2 параметрами, которые были переданы, в данном случае 1 и 1.01 соответственно.

2.2 - ссылку от нашего проинициализированнового объекта мы заносим в nextLink, который был объявлен в 2.1

2.3 - сохраняем ссылку на текущий объект link в first, который был объявлен в пункте 1.

В итоге, у нас получается, что новый занесенный элемент это всегда первый, а тот, что был до этого первым, он становится следующим.

Следовательно, вот что тут будет

    LinkList list = new LinkList(); //first ==null, next - не определен
    list.insert(1, 1.01);  //first == new Link(1, 1.01), next == null
    list.insert(2, 2.02);  //first == new Link(2, 2.02), next == new Link(1, 1.01)
    list.insert(3, 3.03);  //...
    list.insert(4, 4.04);  //...
    list.insert(5, 5.05);  //first == new Link(5, 5.05), next == new Link(4, 4.04)

P.S Если я где-то допустил ошибку, просьба меня поправить.

READ ALSO
javax.servlet.ServletException: UT010013

javax.servlet.ServletException: UT010013

Переношу проект со старого сервера (debian 7, wildfly 82

195
Node.js (telegraf). Непонятная ошибка в сценарии

Node.js (telegraf). Непонятная ошибка в сценарии

Выдает ошибку когда нажать Button ("USD-UAH») после нее Button ("EUR-UAH») показывает ошибку

182
Chart Js Число и день недели

Chart Js Число и день недели

Нужно сделать так

168