题目1 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
解1
- 获取链表个数
- 循环到(总个数减k)个结点,输出
class Solution {
public:
int kthToLast(ListNode* head, int k) {
int nCount = 0;
int i;
ListNode* pTemp = head;
while(pTemp)
{
nCount++;
pTemp = pTemp->next;
}
for(i=0 ; i<nCount-k ; i++)
{
head = head->next;
}
return (head->val);
}
};
解2:
快慢指针,前指针(pFront)从head开始,后指针(pEnd)和前指针相差k位;两个指针一起循环向后移动,当pEnd指向NULL时,pFront即指向链表的倒数第k个元素。
class Solution {
public:
int kthToLast(ListNode* head, int k)
{
ListNode* pFront = head;
ListNode* pEnd = head;
int i;
for(i=0 ; i<k ; i++)
{
pEnd = pEnd->next;
}
while(pEnd != NULL)
{
pEnd = pEnd->next;
pFront = pFront->next;
}
return (pFront->val);
}
};
解3 递归算法
首先,设置两个全局变量,val:用于存储返回的数值,nCount:计数递归返回的次数,初始为k;
其次,从头开始,先递归结点到结尾,然后开始返回。
返回一个,nCount–,当nCount等于-1时,即返回到了第k个结点,将该节点的值赋值给val,最后返回value即可。
class Solution {
public:
int val = 0;
int nCount = 0;
int kthToLast(ListNode* head, int k)
{
nCount = k;
if(head != NULL)
kthToLast(head->next , k);
nCount--;
if(-1 == nCount && 0 == val)
{
val = head->val;
}
return val;
}
};