题目:如题
知识:链表
思路:链表是单向的,可以制造一个跨度为k的尺子,当尺子的末端走到链表的末端时,那么尺子的前段就是倒第k个数。
程序:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* p=pListHead;
ListNode* q=p;
int i=0;
for(;q !=NULL;i++)
{
if(i>=k)
p=p->next;
q=q->next;
}
return i<k?NULL:p;
}
};
难点在于几个条件的具体:
1,q!=NULL
q是尺子的末端,而链表最后一个节点->next=NULL,所以到最后,q是NULL,然后退出循环。
2,i>=k
一开始,先让q往末端走,走到p和q之间的跨度达到k时,接下来两者一起往末端走。
假设k=3。 i=0,p、q都在开头;
i=1,p在开头,q在第二个;
i=2,p在开头,q在第三个;
i=3,p在开头,q在第四个;
在此之前,每次进入循环,i代表的是pq两者的差值。
此时,i=3,pq之间差值为3(=k)个节点(算头算尾总共4个节点)。
现在开始两者一起往末端走,得一直走到 q站在最后一个节点后面,(是个空地址),按照两者差值为3,p才在倒数第三个节点的位置。总结就是“差值为3”和“加上自身总共4个",这一点容易混淆人。
3,i<k?
每次进入循环,i代表q所在位置的索引,最后退出循环时,q站在最后一个节点后面,重点来了:然后和for循环条件比较时,虽然条件不符合退出,但i仍然+1了。(即:for(i=0;i<10;i++)循环退出时,i=10.)所以此时i值是链表的size。