实现LinkedList,Java的方法

时间:2012-11-27 21:52:31

标签: java data-structures linked-list append nodes

我正在读这本书,这一章有关于喜欢的列表,它从单个链表的实现开始,它是这样的:

创建链接列表:

class Node {
    Node next = null;
    int data;

    public Node(int d) {
        data = d;
    }

    void appendToTail(int d) {
        Node end = new Node(d);
        Node n = this;
        while (n.next != null) {
            n = n.next;
        }
        n.next = end;
    }
}

我的问题:

第一:我无法理解这是如何运作的。这真的很复杂,或者我错过了什么吗?

第二:这个“节点”类可以被视为链表吗?我知道它缺少一些功能,但这是一个链接列表吗?

第三:我在java中搜索了LinkedList实现,并在java api中查看了原始类,这是一种完全不同的方法。我应该坚持哪种方法?

3 个答案:

答案 0 :(得分:2)

此代码的问题在于Node类同时是节点链接列表,这令人困惑。除此之外,它应该非常简单。

class Node {
    Node next = null;
    int data;

next保存列表中的下一个节点。如果它是最后一个节点,则它保持nulldata是与此节点关联的数据,在本例中为int类型(BTW应为final)。

public Node(int d) {
    data = d;
}

这是一个简单的constructor,它只是将参数复制到其字段中。它代表列表的头部和列表本身。

void appendToTail(int d) {        
    Node n = this;
    while (n.next != null) {
        n = n.next;
    }

这是找到见面的地方。我重新安排了一些代码,以便更容易理解。 appendToTail方法在列表和列表中添加节点。在上面的代码中,它遍历列表(从this开始,这是列表的头部),以找到 last 节点(next字段设置为{{的节点) 1}})。

null

此处创建一个新节点,并将其添加为当前 last 的下一个节点,从而使其成为列表的最后一个节点。

答案 1 :(得分:1)

接下来是指向下一条数据的链接。

[Data | next->] [Data | next->] .... []

接下来就像一个指针,它指向下一个节点。

appendToTail创建一个节点和链接。

答案 2 :(得分:0)

通常, Node 类应该尽可能小。 Node的主要功能是:

  • 存储Node
  • 的值
  • 将引用(或指针)存储到下一个节点实例

编写Node类的最简单方法应该与上面类似;

public class Node<E> {
    protected E value;
    protected Node<E> next;

    public Node(E value) {
        this.value = value;
    }
}

然后,您可以使用此通用节点类编写自定义 LinkedList 实现。

在您问题中的特定示例代码中,他们在节点类中实现了追加方法,这在我看来并不是一个好习惯。相反,附加应该在 LinkedList 类中,因为该方法不在节点类的责任范围内。

在LinkedList中附加方法

在不同来源上实施的方法可能有所不同。但是附加方法本身看起来大致相同。在实现之前,您必须了解append方法的逻辑。

当链表为空时,头指向空值。 Head是LinkedList类的字段,它是存储链接列表的起始节点的成员。

当你将值附加到链接列表时,首先,head与第一个附加值一起存储,然后,第二个值将是一个新节点,头部的下一个引用或指针指向该节点。等等。你可以查看下面的状态;

// Initial state of the Linked List
// Head is null

HEAD = NULL

// Append 40 to the Linked List 
// Head stores value 40, but next reference is null.

HEAD(40) --> NULL

// Append 10

HEAD(40) --> (10) --> NULL

// Append 20

HEAD(40) --> (10) --> (20) --> NULL

// Append 50

HEAD(40) --> (10) --> (20) --> (50) --> NULL

// Append 100

HEAD(40) --> (10) --> (20) --> (50) --> (100) --> NULL

很明显,Linked List总是以NULL引用结束,这在遍历列表时非常有用。必须有一个点,一个标记暗示“这是道路的终点,终止穿越这条道路”

您还可以在下面查看我为此示例编写的简约简单链接列表实现;

LinkedList的极简主义实现

public class CustomLinkedList<E> {

    private Node<E> head;

    public CustomLinkedList() {
        this.head = null;
    }

    public void appendToList(E value) {
        if(head == null)
            head = new Node<E>(value);
        else {
            Node<E> temp = head;

            // get the end node into the temp
            while(temp.next != null)
                temp = temp.next;

            // temp is the tail now
            // append new Node next to the tail
            temp.next = new Node<E>(value);
        }
    }

    public void printList() {
        if(head == null)
            return;

        System.out.print("List: ");

        Node<E> temp = head;
        while( temp != null ) {
            System.out.print(temp.value.toString() + " ");
            temp = temp.next;
        }

        System.out.println();
    }

}

演示代码

public class DemoCustomLinkedList {

    public static void main(String[] args) {
        CustomLinkedList<Integer> linkedList = new CustomLinkedList<>();

        linkedList.appendToList(40);
        linkedList.appendToList(10);
        linkedList.appendToList(20);
        linkedList.appendToList(50);
        linkedList.appendToList(100);

        linkedList.printList();
    }

}

演示输出

List: 40 10 20 50 100