题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
1.快慢指针法
思路:借用两个指针,快慢指针
- 快指针先走k步
- 当快指针不为空时,快慢指针同时向后走
- 快指针为空时,返回慢指针
图例:
代码:
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head == nullptr)
return nullptr;
ListNode* fast = head;//快慢指针
ListNode* slow = head;
while(k)//快指针先走k步
{
if(fast == nullptr)//k步数比链表长度长,则返回头节点
return head;
fast = fast->next;
--k;
}
while(fast != nullptr)//快慢指针同时走
{
slow = slow->next;
fast = fast->next;
}
return slow;//返回slow指针
}
};
2.递归
代码:
class Solution {
public:
int sz = 0;
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head == nullptr)
return nullptr;
return _getKthFromEnd(head, k);
}
private:
ListNode* _getKthFromEnd(ListNode* head, int k)
{
if(head == nullptr)
return nullptr;
ListNode* node = _getKthFromEnd(head->next, k);
//先递归,最后一层一定会先找到尾节点,然后再进行下面的代码
//当sz 和 k相等的时候,则返回当前的节点
if(++sz == k)
return head;
return node;
}
};