1

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

public class ListItem
{
  Object   item;                  
  ListItem next;                  

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

看起来 recursion--classListItem的实例变量名为ListItem. 调用这种递归是否合适?

这是我曾经在 Pascal 中定义链表的方式。我看到了一些你可能称之为递归(pNodeType,aka ^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;                                   
  }
}

正确的?

4

1 回答 1

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

因为默认的初始化值已经是 null 了。

于 2013-10-03T23:37:59.013 回答