描述
这是一篇面对初级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)
总结
各位牛友在练习的时候要注意边界条件的判定
扩展
快慢指针是链表中一种常见的处理方法
在判断链表中是否有环中也很有用