您的位置:首页 > 其它

输入一个链表,输出该链表中倒数第k个结点。

2016-03-22 13:19 573 查看
1,问题:

输入一个链表,输出该链表中倒数第k个结点。

2,想法都在代码里标注了:

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
//思路1:先扫描链表,得到规模,再顺序扫描到指定位置
//缺点:扫描较多
/*if (pListHead == NULL || k <= 0)
{
return NULL;
}
int count = 0;
ListNode* temp = pListHead;
while (pListHead)
{
count++;
pListHead = pListHead->next;
}
int m = count - k;
//倒数第k个,是顺数第count - k +1个
if (m < 0)
{
return NULL;
}
else
{
while (m > 0)
{
temp = temp->next;
m--;
}
return temp;
}
*/
//思路2:倒数第k个位置,是顺数第n-k+1个位置
//设两个指针都指向头结点,那么第一个指针走k-1步到达顺数第k位置
//然后第二个指针和第一个指针一起走n-k步,即访问完链表,就到达了
//n-k+1位置,即倒数第k位置
if(pListHead == NULL || k <= 0)
{
return NULL;
}
ListNode* temp1 = pListHead;
ListNode* temp2 = pListHead;
//下边for循环的意思:
//若i满足for循环条件,表示还要往下走
//但是temp1->next如果等于空,就说明下边没有节点了,
//说明k比链表长度大,返回空
//否则就往下走到顺数k位置
for (int i =1; i < k; i++)
{
if (temp1->next == NULL)
{
return NULL;
}
else
temp1 = temp1->next;
}
//上面若没有return,即走到了顺数k位置
//那么我再用下边这个while循环,走到
//倒数k位置,即顺数n-k+1位置即可
while (temp1->next)
{
temp2 = temp2->next;
temp1 = temp1->next;
}
return temp2;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: