Java 这本教科书的链表是否包含一个;递归构造函数";?

Java 这本教科书的链表是否包含一个;递归构造函数";?,java,generics,linked-list,Java,Generics,Linked List,这是教科书实现中链表类的一个片段: public class ListItem { Object item; ListItem next; public ListItem(Object item) { this.item = item; next = null; } } 它看起来像递归——类ListItem的

这是教科书实现中链表类的一个片段:

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”:

公共类列表项{
E项目;
下一个列表项;
公共列表项目(E项目){
this.item=项目;
next=null;
}
}
对吗?

没有递归

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


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

next = new ListItem(null);
ListItem next = new ListItem(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;                              
  }
}
因为默认初始化值已经为null。

没有递归

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


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

next = new ListItem(null);
ListItem next = new ListItem(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;                              
  }
}

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

我看不到任何递归-构造函数不调用自身。拥有一个相同类型的实例并没有什么错——否则实现一个链表是非常困难的!这里没有递归。递归纯粹是一个运行时概念。看到你是对的,尽管别人的评论很奇怪。列表是递归数据结构,在数据类型级别存在递归,这导致递归算法(即使它们是使用退化为循环的递归实现的)。也就是说,构造函数本身并不是递归函数。指称语义必须使用一个固定点运算符来建模这样的类型。我看不到任何递归-构造函数不调用自身。拥有一个相同类型的实例并没有什么错——否则实现一个链表是非常困难的!这里没有递归。递归纯粹是一个运行时概念。看到你是对的,尽管别人的评论很奇怪。列表是递归数据结构,在数据类型级别存在递归,这导致递归算法(即使它们是使用退化为循环的递归实现的)。也就是说,构造函数本身并不是递归函数。指称语义必须使用一个定点运算符来对这样的类型进行建模。我没有否决,但在您的代码中也没有看到任何递归。@jim-huh?我的例子不是递归的吗?(确保刷新)Downvote,因为您说过“没有递归”。当您引用刚刚定义的东西的名称时,无论是函数、数据类型还是完全不同的东西,在任何情况下都存在递归。(这并不是说递归是计算机时代的最新发明,你知道……)@lngo在构造过程中没有递归,这就是这个问题,因为在构造过程中没有实例化自己的类。仅仅声明自己类的字段不是递归。我只是在字典中查找了“递归”:递归:见递归我没有否决,但在你的代码中也没有看到任何递归。@jim-huh?我的例子不是递归的吗?(确保刷新)Downvote,因为您说过“没有递归”。当您引用刚刚定义的东西的名称时,无论是函数、数据类型还是完全不同的东西,在任何情况下都存在递归。(这并不是说递归是计算机时代的最新发明,你知道……)@lngo在构造过程中没有递归,这就是这个问题,因为在构造过程中没有实例化自己的类。仅仅声明自己类的字段不是递归。我只是在字典中查找“递归”:递归:参见递归