一般来说,Node类应该尽可能小。节点的主要功能是;
- 存储节点的值
- 存储对下一个 Node实例的引用(或指针)
最简单的 Node 类的写法应该和上面类似;
public class Node<E> {
protected E value;
protected Node<E> next;
public Node(E value) {
this.value = value;
}
}
然后,您可以使用此通用Node类编写自定义LinkedList实现。
在您问题中的特定示例代码中,他们已经在Node类中实现了append方法,我认为这不是一个好习惯。相反,追加应该在LinkedList类中,因为该方法不属于Node类的职责。
LinkedList 中的追加方法
在不同来源上实施的方法可能会有所不同。但是 append 方法本身看起来基本相同。在实现之前,您必须了解 append 方法的逻辑。
当链表为空时,head 指向一个空值。Head 是字段,LinkedList 类的成员,用于存储 Linked List 的起始节点。
当您将值附加到链接列表时,首先,head 与第一个附加值一起存储,然后,第二个值将是一个新节点,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