题目
输入一个链表,输出该链表中倒数第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; } };