题解 | #链表中倒数最后k个结点#
链表中倒数最后k个结点
http://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9
方法一:栈辅助
题目要求的是倒数第k个结点,以后后面的所有节点,那我们就可以把链表的所有元素全部放入栈中,然后依次弹出k-1个,此时栈顶的结点就是第k个结点;
思路大致如下:
(1)创建栈,遍历链表,依次把链表元素入栈;
(2)栈中再依次弹出k-1个元素;
(3)返回栈顶元素
注意:如果给定的k大于了栈的长度,说明找不到这个元素,返回空指针
if(pHead == nullptr) return nullptr;
ListNode* p = new ListNode(-1);
p = pHead;
stack<ListNode*> s;
while(p)
{
s.push(p);
p = p->next;
}
if(k > s.size() || k == 0) return nullptr;//超出了栈的长度,找不到
for(int i = 1;i < k;i ++)
{
s.pop();
}
return s.top();方法二:快慢指针
定义两个指针,分别给其命名为快慢指针,且都将头节点赋给两个指针,然后让快指针先走k个结点,这样两个指针的距离就是k了,最后两个指针分别往后走,当快指针走到头了,慢指针就到了倒数第k个结点了;
思路如下:
(1)定义两个快慢指针,并将头节点赋给它们
(2)让快指针先走k个结点,使两个指针保持距离为k
(3)两个指针同时往后走,当快指针走到头了,慢指针就到了倒数第k个结点了
(4)返回慢指针
if(pHead == nullptr) return nullptr;
ListNode* faster = pHead;
ListNode* slower = pHead;
for(int i = 0;i < k;i++)
{
if(faster == nullptr) return nullptr;
faster = faster->next;
}
while(faster != nullptr)
{
faster = faster->next;
slower = slower->next;
}
return slower;
