题目
题目链接
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
解题
和leetcode-19:删除链表的倒数第N个节点这道题类似,但是比这道题更加简单
方法一:顺序查找
先遍历出链表长度l,再遍历l-k个
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
int l=0;
ListNode* cur=head;
while(cur){
l++;
cur=cur->next;
}
cur=head;
for(int i=0;i<l-k;i++){
cur=cur->next;
}
return cur;
}
};
方法二:双指针
这道题不需要定义哑节点,因为不涉及删除节点 。
先让快指针走k步,然后快慢指针一起走,直到快指针为nullptr为止。
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* slow=head;
ListNode* fast=head;
while(k--){
fast=fast->next;
}
while(fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
};