题目描述:
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
说明:给定的 k 保证是有效的。
分析:
- 先想到的就是将链表中的元素放到一个栈里边保存,然后从栈里边顺序输出第k个值即可,但超出了时间限制。pass
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int kthToLast(ListNode* pHead, int k)
{
//特殊处理
if(pHead == nullptr)
return -1;
//处理
int r = 0;
std::stack<ListNode*>nodes;
ListNode* pNode = pHead;
while(pNode != nullptr)
{
nodes.push(pNode);
pNode = pNode->next;
}
int i = 0;
while(!nodes.empty())
{
pNode = nodes.top();
++i;
if(i == 2)
{
r = pNode->val;
nodes.pop();
}
}
return r;
}
};
- 下一个方法是用两个指针,让这两个指针之间的长度为k,则当第二个指针到了链表末尾时,第一个指针就指向的是链表的倒数第k个值。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int kthToLast(ListNode* pHead, int k)
{
//特殊处理
if(pHead == nullptr)
return -1;
//处理
ListNode* end = pHead;
while(k>0)//让end指向第k个值,此时head还是指向着链表头
{
end = end->next;
--k;
}
while(end != NULL)//当end没有走到链表结尾时,head和end两个指针一块儿移动知道end遇到了链表结尾结束
{
pHead = pHead->next;
end = end->next;
}
return pHead->val;//此时这个头指针指向的数就是倒数第k个值
}
};