这个教科书链表是否涉及“递归构造函数”?

时间:2013-10-03 23:19:14

标签: java generics linked-list

这是来自教科书实施的链表类的片段:

public class ListItem
{
  Object   item;                  
  ListItem next;                  

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

看起来像递归 - 类ListItem的实例变量名为ListItem。这个递归调用是否合适?

以下是我曾经在Pascal中定义链表的方法。我看到了一些你可以称之为递归的提示(pNodeType,a.k.a。^NodeType),但它不像Java片段中的那样:

type
    **pNodeType** = ^NodeType ;  

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

所以我想因为Java没有指针和对象是引用,所以我看着同样的事情。正确?

所以如果我想要一个双向链表(也是向后),我会添加一个像这样的实例变量

ListItem prev;

并在构造函数中添加一行代码,如此

prev = null;

并进行相同数量的护理,使前向联动起作用。

右?

最后,如果我想要一个泛型链接列表,我只需更改代码片段,并在方法中将所有出现的“Object”更改为“E”:

public class ListItem<E> {

  E item;                    
  ListItem next;                     

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

右?

1 个答案:

答案 0 :(得分:1)

没有递归。

当您声明与该类型相同的字段时,您不会实例化实例。


你的构造函数是否包含初始化:

next = new ListItem(null);

或声明包括初始化:

ListItem next = new ListItem(null);

会有递归


关于通用问题,您还需要输入字段:

public class ListItem<E> {

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

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

请注意,您无需编码:

next = null;  // redundant

因为默认初始值已经为空。