Java 关于链表3要素

Java 关于链表3要素,java,data-structures,Java,Data Structures,我是一个新的bie的世界的数据结构和学习它,我有一个关于链表的查询,因为在一次采访中,它被问到的上下文链表是如何找到第三个元素从一个链表结束在一个通过,我不知道这一点,请告知 if(node.next.next.next == null) 这有点脏,但基本上我只需要检查下一行的节点3节点是否为空。如果是的话,你已经得到了最后的第三个。当然,这不包括大小小于3的列表。我假设列表中的第一个节点称为head 所以把指针设为head,我们称之为current Node current = head;

我是一个新的bie的世界的数据结构和学习它,我有一个关于链表的查询,因为在一次采访中,它被问到的上下文链表是如何找到第三个元素从一个链表结束在一个通过,我不知道这一点,请告知

if(node.next.next.next == null)

这有点脏,但基本上我只需要检查下一行的节点3节点是否为空。如果是的话,你已经得到了最后的第三个。当然,这不包括大小小于3的列表。

我假设列表中的第一个节点称为head

所以把指针设为head,我们称之为current

Node current = head;
然后再做一个指向前方三个位置的指针

Node threeAhead = head.next.next.next;
然后编写一个循环,首先检查threeAhead.next是否为null,如果不是:

threeAhead = threeAhead.next;
curr = curr.next;

当threeAhead.next变为null时,您距离当前结束位置有三个位置。

如果您在开始之前知道列表的长度,请使用JB Nizet的方法

node = first;
for (i = 0; i < length - N_FROM_END; i++) {
    node = node.next;
}

result = node.value
或者类似的。(检查边界条件…并说明列表长度从\u端开始小于
N\u


这两个答案都满足“最多访问一次节点”约束。

使用java.util.LinkedList:LinkedList.get(LinkedList.size()-3)@JBNizet能否请您显示更新的代码,谢谢它是LinkedList.size()不是LinkedList.length()…@JBNizet不是LinkedList.size()??不认为链表有length()方法,或者有?@JBNizet请在简单步骤中指定算法。如果前面的任何节点.next为null,则可能导致NullPointerException。如果linkedlist的大小为3或更大,则不会。假设在循环过程中没有任何节点被触碰。当然如果我们这样假设,但我猜。。这样会更安全,对吗?如果(node!=null&&node.next!=null&&node.next.next!=null&&node.next.next==null)
节点
引用当前节点。我已经说明了一个假设,即名单的规模不会小于3个。因此,前3个节点的
next
值与null值不同。此时,您可以开始循环:
node.next.next.next
将不会受到NPE的影响,因为我们之前已经说过前3个节点将有一个
next
值。循环中的每个迭代,
节点
值将移动一个点,因此在继续之前只留下一个失败点。对我来说,一次通过并不意味着只有一条语句。这意味着每个节点最多只能访问一次。您的解决方案几乎会访问每个节点三次。但是这个问题太糟糕了,不可能给出一个好的答案,但这几乎是三次通过。不仅仅是1。@JBNizet一次通过意味着第一次通过完整的列表。或者,在不知道列表中项目的数量的情况下找到倒数第三个元素。由于问题中的细节太少,不可能给出一个好的答案。如果你追求的是性能,不存储列表的大小会适得其反。@BredttD非常感谢,你能举一个小例子,假设我的链接列表是head->1->2->3->4->5->6->7->8,那么请告诉我上面的算法将如何工作以及需要多少遍。提前谢谢
nodes = new Node[N_FROM_END];
node = first;
for (i = 0; node != null; i++) {
    nodes[i % N_FROM_END] = node;
    node = node.next;
}
result = nodes[i % N_FROM_END].value