Проблемы с пониманием реализации связанного списка - PullRequest
5 голосов
/ 01 марта 2012

Обновление: Большое спасибо всем, кто откликнулся !!!Это заставило меня почувствовать, что я не совсем одинок в своих усилиях по изучению Java.Пожалуйста, извините, но я думаю, что я недостаточно прояснил, что я не получаю о связанных списках и приложении упражнения - сначала

- как определение класса может содержать объектсамо по себе, я знаю, что это рекурсия, но это все еще очень странная и чуждая мне концепция.

секунда - как именно объект связанного списка может «связать» другой узел?

третье - если два объекта разделены знаком равенства, это означает, что - что второй объект исчезает, а от него остается только его «имя», которое теперь указывает на первый объект или порокнаоборот?

тогда - то, что я не понимаю в программе, которую я цитировал ниже, заключается в следующем: после создания экземпляра класса linkList вызывается его конструктор, и он дает объектКласс Link private Link сначала имеет значение null, т.е. устанавливает его, указывая на ничто.Затем, когда создается первый новый узел, вызывается метод public void insertFirst, он присваивает значения объекта своим переменным, а затем происходит нечто абсурдное - сначала объект, который указывает на ничто, присваивается новому элементу, таким образом заставляя оба объекта указывать наничего и с первым = newLink;Я полностью потерян ...

Я учусь в колледже на Алгоритмы и структуры данных, и, поскольку профессор действительно подлый и его объяснения бесполезны, я пытаюсь учиться самостоятельноиз книги под названием «Алгоритмы и структуры данных» Роберта Лафора.

Теперь я изучаю связанные списки, и в книге приведен следующий пример кода для реализации связанного списка:

Link.java:

class Link
   {
   public int iData;              // data item
   public double dData;           // data item
   public Link next;              // next link in list

   public Link(int id, double dd) { // constructor
      iData = id;                 // initialize data
      dData = dd;                 // ('next' is automatically
      }                           //  set to null)

   public void displayLink() {     // display ourself
      System.out.print("{" + iData + ", " + dData + "} ");
      }
   }

LinkList.Java:

class LinkList {
   private Link first;            // ref to first link on list

   public LinkList() {             // constructor
      first = null;               // no links on list yet
      }

   public boolean isEmpty() {      // true if list is empty
      return (first==null);
      }
                                  // insert at start of list
   public void insertFirst(int id, double dd) { // make new link
      Link newLink = new Link(id, dd);
      newLink.next = first;       // newLink --> old first
      first = newLink;            // first --> newLink
      }

   public Link deleteFirst() {     // delete first item
      // (assumes list not empty)
      Link temp = first;          // save reference to link
      first = first.next;         // delete it: first-->old next
      return temp;                // return deleted link
      }

   public void displayList() {
      System.out.print("List (first-->last): ");
      Link current = first;       // start at beginning of list
      while(current != null)      // until end of list,
         {
         current.displayLink();   // print data
         current = current.next;  // move to next link
         }
      System.out.println("");
      }
   }

LinkListApp.java:

class LinkListApp {
   public static void main(String[] args) {
      LinkList theList = new LinkList();  // make new list

      theList.insertFirst(22, 2.99);      // insert four items
      theList.insertFirst(44, 4.99);
      theList.insertFirst(66, 6.99);
      theList.insertFirst(88, 8.99);

      theList.displayList();              // display list

      while( !theList.isEmpty() ) {        // until it's empty,
         Link aLink = theList.deleteFirst();   // delete link
         System.out.print("Deleted ");         // display it
         aLink.displayLink();
         System.out.println("");
         }
      theList.displayList();              // display list
      }
   }

Я просто НЕ МОГУ понять код, который вставляет и отображает элементы в классе связанного списка.

Как может получиться, что newLink.next = first; and first = newLink; после создания нового объекта?

Пожалуйста, помогите!

Ответы [ 5 ]

8 голосов
/ 01 марта 2012

Каждый Link содержит ссылку .next на следующий элемент Link (кроме последнего элемента, имеющего .next = null.

A LinkList содержит ссылку (.first) напервый Link объект, который он содержит.

Чтобы вставить новый Link в начало LinkList, нам нужно сделать следующее:

  1. Создатьновый Link объект для вставки впереди (newLink).
  2. Пусть вновь созданный Link указывает на предыдущий первый Link объект в качестве .next
  3. Reset.first ссылка LinkList на объект newLink, эффективно перезаписывающая предыдущую ссылку (отмеченную крестиком ниже).

Source: See cacoo.com/diagrams/SRZoHdJ4GEn5PKAF

Этоточно, что происходит:

public void insertFirst(int id, double dd) {
    Link newLink = new Link(id, dd);
    newLink.next = first;
    first = newLink;
}
2 голосов
/ 01 марта 2012

Предположим, у нас есть связанный список, подобный этому:

 first                -> Link("monday")
 Link("monday").next  -> Link("tuesday")
 Link("tuesday").next -> Link("wednesday")

Теперь мы хотим, чтобы неделя начиналась с "воскресенья".

Сначала мы создадим новую ссылку для "воскресенья":

 Link("sunday")                             # newLink = new Link(id,dd)

и скажите ему, что его последователь "понедельник"

 first                -> Link("monday")
 Link("sunday").next  -> Link("monday")     # newLink.next = first
 Link("monday").next  -> Link("tuesday")
 Link("tuesday").next -> Link("wednesday")

Наконец мы исправляем начало недели

 first                -> Link("sunday")     # first = newLink
 Link("sunday").next  -> Link("monday")     
 Link("monday").next  -> Link("tuesday")
 Link("tuesday").next -> Link("wednesday")
2 голосов
/ 01 марта 2012

Что могло вас смущать, так это то, что эта реализация списка является LIFO (Last In First Out), поэтому последний вставленный элемент - это первый, возвращаемый при обходе.

newLink.next = first; помещает первый первый элемент в качестве следующего (второго) нового элемента

first = newLink; помещает новый элемент в начало списка

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

1 голос
/ 01 марта 2012

Когда ваш новый узел добавляется, он добавляется в начало LinkedList, так как указатель First указывал на первый узел в списке, но по прибытии нового узла в тот же список, этоСначала указатель должен указывать на вновь добавленный узел, а вновь добавленный узел должен указывать на ранее установленный первый узел, чтобы он мог стать первым узлом связанного списка.

Надеемся, что эта диаграмма немного объяснитдалее:

LINKED LIST IMAGE

Вот почему вы должны написать newLink.next = first; and first = newLink;

1 голос
/ 01 марта 2012

Вы добавляете новый Link к заголовку объекта LinkList, устанавливая head = newLink;

Вы добавляете существующий список к next нового элемента, устанавливая newLink.next = first;

...