题目描述:
输入一个链表,输出该链表中倒数第k个结点。
注意:
k >= 0
;- 如果k大于链表长度,则返回 NULL;
样例
输入:链表:1->2->3->4->5 ,k=2
输出:4
解法一:时间复杂度O(n)
- 先判断 K 的合法性,如果 K==0,则返回NULL。
- 求出链表的长度。再判断K是否大于链表的长度。如果大于,则返回NULL,否则继续。
- 从头开始遍历 len - K 个节点,则下一个节点,也就是第 len-K+1 个节点就是所求节点。(len 表示链表的长度)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* findKthToTail(ListNode* pListHead, int k) {
if(k==0)
{
return NULL;
}
int len = 0;
len = count(pListHead);
if(k > len)
{
return NULL;
}
ListNode* p = pListHead;
int space = len - k;
while(space > 0)
{
p = p->next;
space --;
}
return p;
}
int count(ListNode* pListHead)
{
int len = 0;
ListNode* p = pListHead;
while(p)
{
len ++;
p = p->next;
}
return len;
}
};
解法二:空间换时间
使用 stack,先依次将链表元素压入栈,然后从栈中弹出第 K 个节点,即是所求节点。同时判断极端情况。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* findKthToTail(ListNode* pListHead, int k) {
if(k==0)
{
return NULL;
}
stack<ListNode* >st;
ListNode* p = pListHead;
while(p)
{
st.push(p);
p = p->next;
}
if(st.size() < k)
{
return NULL;
}
p = pListHead;
for(int i=1; i<=k; i++)
{
p = st.top();
st.pop();
}
return p;
}
};