Java如何实现链接列表

时间:2011-11-01 07:10:59

标签: java pointers

Java没有指针的概念。那么java如何实现隐式可用的linkedList,甚至为此做一个浅表副本呢?

3 个答案:

答案 0 :(得分:5)

Java确实有可以指向另一个对象的引用,或者为null。这就是链表所需要的一切。

通过为节点提供结构,在C中执行通用链表,同样,Java中的LinkedList也包含参考实际值的节点的私有类,以及对节点类的1个或多个引用链接。

答案 1 :(得分:4)

Java有参考。这些就像指针,除了你不能做像指针算术,或者指向整数的指针,反之亦然。

当然,链接列表是使用引用实现的。


Java避免指针算术和整数与指针之间转换的原因包括:

  • 消除主要的错误来源,
  • 使得实现全功能(即非保守,非引用计数,高性能)垃圾收集成为可能。

答案 2 :(得分:2)

您当然可以在Java中轻松实现自己的链接列表。您也可以使用java.util.LinkedList Class

这是Ivor Horton的书“Beginning Java”中的一个简单的LinkedList实现:

public class LinkedList {
  // Default constructor - creates an empty list
  public LinkedList() {}

  // Constructor to create a list containing one object
  public LinkedList(Object item) {
    if(item != null) {
      current=end=start=new ListItem(item); // item is the start and end
    }
  }

  // Construct a linked list from an array of objects
  public LinkedList(Object[] items) {
    if(items != null) {
      // Add the items to the list
      for(int i = 0; i < items.length; i++) {
        addItem(items[i]);
      }
      current = start;
    }
  }

  // Add an item object to the list
  public void addItem(Object item) {
    ListItem newEnd = new ListItem(item);   // Create a new ListItem
    if(start == null) {                     // Is the list empty?
      start = end = newEnd;                 // Yes, so new element is start and end
    } else {                                // No, so append new element
      end.next = newEnd;                    // Set next variable for old end
      end = newEnd;                         // Store new item as end 
    }
  }

  // Get the first object in the list
  public Object getFirst() {
    current = start;
    return start == null ? null : start.item;
  }

  // Get the next object in the list
  public Object getNext() {
    if(current != null) {
      current = current.next;        // Get the reference to the next item
    }
    return current == null ? null : current.item;
  }

  private ListItem start = null;         // First ListItem in the list
  private ListItem end = null;           // Last ListItem in the list
  private ListItem current = null;       // The current item for iterating
  private class ListItem {
    // Constructor 
    public ListItem(Object item) {
      this.item = item;                  // Store the item
      next = null;                       // Set next as end point
    }

    // Return class name & object
    public String toString() {
      return "ListItem " + item ;
    }

    ListItem next;                       // Refers to next item in the list
    Object item;                         // The item for this ListItem
  }
}