这是来自教科书实施的链表类的片段:
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;
}
}
右?
答案 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
因为默认初始值已经为空。