我有一个单独的链表。
例如: 52 - > 79 - > 67 - > 50 - > 16 - > 99 - > 75
如果我想从逆序中获得第3个数字(应该是16),我该怎么办? 该要求不允许我反向列表。
唯一的提示是: 有一种算法只扫描一次链表!一种可能性是使用两个指针扫描列表。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:8)
如果k
是尾部元素的编号,则创建两个指针:一个指向开始,另一个指向开始+ k。同时增加两者。当第二个到达结尾时,第一个到达你的元素。
答案 1 :(得分:3)
使用两个指针:
Node* kthFromEnd(int k, Node *first) {
Node *second = first;
// Advance first k-1 times
while(first && --k) {
first = first->next();
}
// Now second is k nodes behind first, go to the end
while(first) {
first = first->next();
second = second->next();
}
// First is at the end, second is still k nodes behind
return second;
}
答案 2 :(得分:1)
以下内容
T *first = 0;
T *last = head;
size_t i = 0;
while ( i < N && last )
{
++i;
last = last->next;
}
if ( i == N )
{
first = head;
while ( tail )
{
++tail;
++first;
}
}
return first;
答案 3 :(得分:0)
保持大小为3的circular array,或者更一般地说,大小为k(对于第k个最后一个元素)。
浏览列表,然后只需添加到数组中。完成后,返回数组中的下一个元素。
替代方案是其他答案中建议的两个指针。
示例输入:
52 -> 79 -> 67 -> 50 -> 16 -> 99 -> 75
数组看起来像:
[0, 0, 0]
[52, 0, 0]
[52, 79, 0]
[52, 79, 67]
[50, 79, 67]
[50, 16, 67]
[50, 16, 99]
[75, 16, 99]
然后返回下一个元素 - &gt; 16
。