22. 倒数第中倒数第k节点
文章目录
- [22. 链表倒数第k节点](https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/)
-
- 解题思路一
- 解题思路二
- 解题思路三
输入链表,输出链表中倒数第K节点。为了满足大多数人的习惯,这个问题从1开始计数,即链表的尾节点是倒数第一节点。 例如,链表有 6 从头节点开始,它们的值依次是 一、二、三、四、五、六。链表倒数第 3 节点值为 4 的节点。 示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
解题思路一
暴力解法: 1.获取链表的元素数n 2.将head指针移动到n-k-1的位置上
class Solution {
public: ListNode* getKthFromEnd(ListNode* head, int k) {
//方法1。也许数组的元素格式提取后面的值 int n = 0; ListNode *temp = head; while(temp != nullptr) {
temp = temp->next; n ; } for(int i = 0; i < n - k; i){
head = head->next; } return head; } };
解题思路二
双指针: 1.定义一个slow指针和一个fast指针分别指向第一个元素和第k个元素 2.同时向后移动两个指针,直到fast空指针,结束 3.返回slow
class Solution {
public: ListNode* getKthFromEnd(ListNode* head, int k) {
/方法二,双指针 ListNode *slow = head; ListNode *fast = head; for(int i = 0; i < k; ++i) {
fast = fast->next;
}
while(fast != nullptr) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};
解题思路三
将双指针进行改进,节省内存消耗。
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
//将双指针进行改进,节省内存消耗。
ListNode *fast = head;
for(int i = 0; i < k; ++i) {
fast = fast->next;
}
while(fast != nullptr) {
head = head->next;
fast = fast->next;
}
return head;
}
};