什么是数组链接结构或节点数组?

时间:2015-01-19 19:15:03

标签: java arrays data-structures arraylist linked-list

我是几个java数据数据结构练习。

这是我目前正在进行的练习

  

将数组链接层次结构添加到整体结构中。使用以下名称:AbstractNodeArrayMyListNodeArraySortedNodeArrayUnsorted

我已经实现了抽象数组列表,排序数组列表,未排序数组列表,抽象链表,排序链表和未排序链表。

但是我对这个数组链接结构或节点数组是什么感到困惑。

我尝试为数组链表或结构执行google search,但我得到的只是导致数组和链表之间存在差异的搜索。任何人都可以澄清或确认我对这个节点阵列或阵列链接结构实际上是什么的初步看法吗?

当我想到一个节点时,我想到一个链表中的一个节点,一个包含数据的东西,以及它所连接的节点的引用,类似于 来自these lecture notes for ListNode.java

 public class ListNode {
         int data;
         ListNode next;
         public ListNode() {
               this(0, null);
         }
        public ListNode(int data) {
                this(data, null);
        }
        public ListNode(int data, ListNode next) {
               this.data = data;
              this.next = next;
        }
    }

当我想到阵列时。我想一些支持随机访问的东西,就像你可以访问数组中的任何元素一样,它需要一段时间。那么节点数组会是这样的吗? (您将ListNode定义为私有内部类),外部类看起来像

public class NodeArray {
       private ListNode[] elementData;
        ...
       private class ListNode {
           ....
       }
 }

我不认为我最初的想法是正确的,因为通用数组列表的整个想法是它适用于任何类型的数据。为什么有一个特殊的ArrayNode类呢?

1 个答案:

答案 0 :(得分:1)

链接列表可以是基于数组的,也可以是基于指针的。如果您已经学习过C ++,那么您可能已经熟悉了指针。它们也存在于Java中,但它们在幕后由java编译器控制,因此您不必明确引用它们。如果您将这些结构视为数组与链接列表,您可能会对自己感到困惑。你真的应该考虑数组和指针。我知道你在java中问过这个问题,但是既然你没有在java中明确地使用指针,那么在C ++中查看一个例子会更有意义。

假设你有一个列表类,ArrayList和PointerList。 ArrayList可能设置如下:

class ArrayClass
{
public:
// Default constructor 
ArrayClass();

// Returns the next item in the list using currentPos
// If the end of the list is reached, 
// currentPos is reset to begin again.
ItemType getNextItem();

//other methods

private:
    int length;                // Number of items
    ItemType info[MAX_ITEMS];  // Array of items
    int currentPos;            // List iterator
};

使用基于数组的链表实现getNextItem()看起来像这样:

ItemType ArrayList::getNextItem()
{
    currentPos++;
    return info[currentPos];
}

通过此实现,该方法返回存储在索引currentPos指向的对象的副本。索引号本身(currentPos)永远不会泄露给调用它的代码,并且由于返回的对象是存储对象的副本,因此对副本所做的任何更改都不会自动对存储的版本进行。要存储对象的更新版本,用户必须在info [currentPos]中删除存储的对象,然后在其位置添加新版本。希望这是有道理的。

现在让我们来看看PointerList。它可能是这样定义的:

class PointerList
{
public:
// Default constructor : 
PointerList();

// Returns the next item in the list using currentPos
// If the end of the list is reached, 
// currentPos is reset to begin again.
ItemType getNextItem();

//other methods

private:
    int length;             // Number of nodes on list
    NodeType* listData;     // List head ptr
    NodeType* currentPos;   // List iterator
};

基于指针的getNextItem()的实现可能如下所示:

ItemType PointerArray::getNextItem()
{
    ItemType item;
    if (currentPos == NULL)
    {
        currentPos = listData;
    }
    else
    {
        currentPos = currentPos->next;
    }
    item = currentPos->info;
    return item;
}

此实现将返回链接列表中项目的地址。使用指针将通过引用返回对象,而使用数组将按值返回对象。由于调用此方法的代码可以直接访问存储的对象,因此将立即对存储的对象进行对此实现中的对象所做的任何更改。

在上述两个示例中,不要担心ItemType和NodeType。这些在C ++中并不是特殊的数据类型。它们可以很容易地成为Foo或Car等。此外,它们都可以引用相同的数据类型。

我希望这是有道理的。如果您还有其他问题,请与我们联系。