2013-10-03 5 views
1

Это фрагмент из связанного класса список из реализации учебника:Связанный ли этот учебник список «рекурсивный конструктор»?

public class ListItem 
{ 
    Object item;     
    ListItem next;     

    public ListItem(Object item) 
    { 
    this.item = item;    
    next  = null;     
    } 
} 

Похоже рекурсии - класс ListItem имеет экземпляр переменной также имени ListItem. Правильно ли назвать эту рекурсию?

Вот как я однажды определил связанный список в Паскале. Я вижу намек на то, что вы могли бы назвать рекурсию (pNodeType, иначе ^NodeType), но он не чувствует, как что выше фрагмент кода Java:

type 
    **pNodeType** = ^NodeType ; 

    NodeType = record   
     name : string ;   
     next : **pNodeType** ; // conceptually, change the type to **^NodeType** 
    end ; 

Так что я думаю, так как Java не хватает указателей и объекты ссылки, В конце концов, я смотрю на то же самое. Правильно?

И поэтому, если я хотел дважды связанный список (назад, тоже), я бы добавить переменную экземпляра, как так

ListItem prev; 

и добавить строку кода в конструктор как так

prev = null; 

и проявите ту же самую заботу, которая заставила работать с прямой связью.

Справа?

И, наконец, если я хотел общий связанный список, я бы просто изменить фрагмент кода, как это и изменить все вхождения «Объект» в «Е» в методах):

public class ListItem<E> { 

    E item;      
    ListItem next;      

    public ListItem(E item) { 
    this.item = item;        
    next = null;         
    } 
} 

Right ?

+0

Я не вижу никакой рекурсии - конструктор не называет себя. И нет ничего плохого в том, что у вас есть экземпляр того же типа - в противном случае было бы сложно реализовать Linked List! –

+0

Здесь нет рекурсии. –

+0

Рекурсия - это чисто концепция времени исполнения. См. [Этот ответ] (http://stackoverflow.com/a/1949502/18157) –

ответ

1

Рекурсия отсутствует.

В то время как вы объявить поле одного и того же типа, что и класс, вы не Instantiate экземпляром.


Если бы ваш конструктор включен инициализация:

next = new ListItem(null); 

Или декларация включена инициализация:

ListItem next = new ListItem(null); 

Там будет рекурсия


Что касается общего Qu estion, вам необходимо ввести в поле тоже:

public class ListItem<E> { 

    E item;      
    ListItem<E> next; // Added generic parameter     

    public ListItem(E item) { 
    this.item = item;        
    } 
} 

Обратите внимание, что вам не нужно код:

next = null; // redundant 

Поскольку значение по умолчанию инициализируется равно нулю уже.

+1

Downvote ??? Почему так? – Bohemian

+0

Я не спускал вниз, но я тоже не вижу рекурсии в вашем коде. –

+0

+1 для отмены downvote. – rgettman

Смежные вопросы