【发布时间】:2013-09-28 19:58:36
【问题描述】:
所以我从考试中得到了这个问题。
如何从单链表的尾部获取第 n 个节点?
每个节点都有一个值和一个下一个(指向下一个值的指针)。我们得到了这个:
getNodeFromTail(Node head, int x) {
}
所以我这样做的方法是通过遍历一次来找到列表的长度。然后再去获取 (length - x) 节点。所以总共有 2 次遍历。
getNodeFromTail(Node head, int x) {
int length = 0;
Node headdupe = head;
while (headdupe.next != NULL) {
headdupe = headdupe.next;
length++;
}
int a = length--;
for (int y = 0; y < a; y++) {
head = head.next;
}
return head;
}
这是对的,但还有一个额外的问题是询问我们是否可以做同样的事情,但只遍历一次。考试的时候想不出来,后来想了一个办法,但又不太确定。
我可以创建一个长度为 x 的 ArrayList。然后每次我运行while循环时,我都会在数组的顶部添加一个元素,向下级联并启动数组的最后一个元素。然后当头部命中null时,返回数组[x-1]处的节点。
这是对的吗?有没有更好的解决方案?
【问题讨论】:
-
我不太确定您在最后一段中所说的内容,但如果我不必担心会浪费大小的东西,我会说制作一个节点指针向量并作为您进行第一次迭代,将节点指针附加到遍历的每个节点的向量。然后当你到达最后,vector[list.length-x]。这几乎违背了链表的重点,但我认为这就是问题的重点。
-
这个问题很可能希望您使用递归解决方案。
-
@iCode4Food ...或者意识到您可以将最后一个
x头保存在内存中。 -
@iCode4Food 这将需要堆栈上的
O(n)额外内存,因此与将整个链表复制到数组并从后面获取xth 元素一样有效。
标签: algorithm linked-list singly-linked-list