Дана реализация связанного списка:
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. При повторном вызове метода ссылка переписывается. Где сохраняется предыдущий элемент?
Можно разобрать этот пример более детально, чтобы понять, что происходит, например, так
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 Если я где-то допустил ошибку, просьба меня поправить.
Переношу проект со старого сервера (debian 7, wildfly 82
Выдает ошибку когда нажать Button ("USD-UAH») после нее Button ("EUR-UAH») показывает ошибку