【发布时间】:2016-11-21 16:01:33
【问题描述】:
在单/双链表中从最后一个元素中查找第 n 个元素的有效方法是什么?
【问题讨论】:
-
这似乎毫无意义,没有比这种琐碎的方法更好的办法了。
标签: data-structures linked-list
在单/双链表中从最后一个元素中查找第 n 个元素的有效方法是什么?
【问题讨论】:
标签: data-structures linked-list
这是从链表中的最后一个元素中查找第 n 个元素的有效方法。
struct Node{
int data;
struct Node *next;
};
int getNthFromLast(struct Node *head, int n){
struct Node *curr = head;
struct Node *nthFromLast=NULL;
int count=0;
int value=-1;
while(curr!=NULL){
count++;
curr=curr->next;
if(count==n){
nthFromLast=head;
}else
if(count>n){
nthFromLast=nthFromLast->next;
}
}
if(count>=n){
value=nthFromLast->data;
}
return value;
}
这个例子是用 C++ 编写的,可以类似地用其他语言复制。该方法传递一个指向链表第一个节点的指针和最后一个元素的索引,它返回其数据。如果该位置不存在,则该方法返回 -1。
在双向链表和循环链表的情况下可以采用类似的方法。
编辑:如果是双向链表,只需反向移动 n 个项目。完全忘记了这一点。致谢:吉姆·米歇尔
【讨论】:
n 个节点。另请注意,这与对列表进行完整扫描以查找计数,然后从头开始并向前推进(count-n) 次相比,效率基本上并没有提高或降低。
(loop 1),然后向前移动(count-n) 次,您不会徒劳地执行(count - n) 长度的第二个循环吗?如果说 n 的值在较小的一侧,那么您实际上将不得不遍历列表的一半以上而没有任何有意义的增益。所以我猜这就是第二个指针发挥作用的地方,它跟踪 (count-n) 项的位置。
count + (count-n) 指针增量。在两遍版本中,您在一遍中执行count 增量,在第二遍中执行(count-n) 增量。无论哪种方式,完成的工作量都是一样的。