我正在读这本书,这一章有关于喜欢的列表,它从单个链表的实现开始,它是这样的:
创建链接列表:
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中查看了原始类,这是一种完全不同的方法。我应该坚持哪种方法?
答案 0 :(得分:2)
此代码的问题在于Node
类同时是节点和链接列表,这令人困惑。除此之外,它应该非常简单。
class Node {
Node next = null;
int data;
next
保存列表中的下一个节点。如果它是最后一个节点,则它保持null
。 data
是与此节点关联的数据,在本例中为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类的最简单方法应该与上面类似;
public class Node<E> {
protected E value;
protected Node<E> next;
public Node(E value) {
this.value = value;
}
}
然后,您可以使用此通用节点类编写自定义 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引用结束,这在遍历列表时非常有用。必须有一个点,一个标记暗示“这是道路的终点,终止穿越这条道路”
您还可以在下面查看我为此示例编写的简约简单链接列表实现;
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