描述
这是一篇面对初级coder的题解。
知识点:链表 栈
难度:一星
题解
题目: 输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。
考察链表的基础知识
方法一:栈
利用栈后进先出的特性,可以方便的提取最后k个元素
#include <stack>
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
stack<ListNode *> stack;//栈
ListNode *answer=NULL;//返回值
while(pHead)//全部入栈
{
stack.push(pHead);
pHead=pHead->next;
}
if(k>stack.size()||stack.size()==0) //判断特殊值
return answer;
for(int i=0;i<k;i++)
{
answer=stack.top();
stack.pop();
}
return answer;
}
};
运行时间 6ms 占用内存 504KB
方法二:快慢指针
要求链表的倒数第k个节点,可以采用快慢指针的方法,快指针先移动k步,然后慢指针再从头开始,这个时候快慢两个指针同时移动,当快指针到链表的末尾的时候,返回慢指针即可。
注意边界条件,如果第一个指针还没走k步的时候链表就为空了,应返回null,同时还要校核k与链表长度等长的情形
代码如下:
c++版
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
ListNode *fast=pHead;//快指针 初始化头结点 先走一步
ListNode *slow=NULL;//慢指针 初始化为空 长度不够直接返回
if(pHead==NULL)
return slow;
for(int i=0;inext;
if(fast==NULL&&inext;
slow=slow->next;
}
return slow;
}
}; 运行时间: 2 ms 占用内存:512K
该方法空间复杂度O(1)
总结
各位牛友在练习的时候要注意边界条件的判定
扩展
快慢指针是链表中一种常见的处理方法
在判断链表中是否有环中也很有用

京公网安备 11010502036488号