这是来自教科书实现的链表类的代码片段:
public class ListItem
{
Object item;
ListItem next;
public ListItem(Object item)
{
this.item = item;
next = null;
}
}
它看起来像递归--类ListItem
的实例变量也命名为ListItem
。称之为递归合适吗?
以下是我曾经在 Pascal 中定义链表的方式。我看到了一个你可以称之为递归(pNodeType
,又名递归的暗示。 ^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;
}
}
右?
没有递归。
声明与类类型相同的字段时,不会实例化实例。
包含构造函数初始化:
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
因为默认初始化的值已经为 null。