我看到2个youtube视频显示了这样的添加方法
public void insertFirstLink(String bookName, int millionsSold) {
Link newLink = new Link(bookName, millionsSold);
newLink.next = firstLink;
firstLink = newLink;
}
这看起来很干净,但是我经历了另一个做这个的教程
public void insert(int x) {
if (head == null) {
head = new Node(x, head);
} else {
Node current = head;
while (current.getNext() != null) {
current = current.getNext();
}
Node newNode = new Node(x, null);
current.setNext(newNode);
}
}
为什么我会使用第二个,因为它更长,并遍历列表只是为了添加到最后。我是链接列表的新手,我很困惑为什么这么多人用不同的方式编写它,我看到的每个教程都使用不同的技术。我主要研究这个是为了能够回答面试问题所以我需要了解所有可能性。
我也不清楚“头/当前/第一”节点是什么。在一个教程中他提到head是第一个添加的节点,并成为下一个添加的节点,所以最终'head'节点是最后一个节点吗?当他打印他的清单时,它是相反的。
答案 0 :(得分:2)
第一种方法是在当前位置插入一个节点(它看起来像是指向列表末尾的指针)。第二个节点在末尾插入一个节点,但没有维护尾指针,因此它必须先遍历列表,直到找到结束节点,然后将新节点放在那里。
第一个版本或第二个版本是否“更正确”更多的是您的特定软件要求。他们都是正确的;他们只是以不同的方式做同样的事情。虽然这个例子看起来特别微不足道,但当你试图在跳过列表和二叉树之间做出选择时,它并不是那么简单。
答案 1 :(得分:2)
第二种做法的原因是通常假定add方法将元素放在列表的末尾。如果您使用ArrayList和LinkedList,则会看到元素按照添加顺序打印。 ArrayList和LinkedList的行为方式非常重要。
优化第二段代码的一种方法是存储指向列表尾部的指针以及一个指向头部的指针,以便adds和pushes都采用O(1)时间。但是,如果排序与数据结构无关,则应使用第一种方法。
编辑:为了澄清,对于“添加”,您必须使用第二种方法(或某些变体)才能使其成为添加,而对于“推送”,您必须使用与第一种方法类似的东西;但是没有理由你的班级不能兼得。