题目:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
// 二刷这道题啦~~
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
/*
两种思路:
方法一:两次遍历,第一次计数,第二次遍历到 倒数第k步
方法二:一次遍历,双指针,fast指针先往前走k-1 步,接来下slow和fast两个指针同时往前走
*/
public:
ListNode* getKthFromEnd(ListNode* head, int k)
{
ListNode* fast = head;
ListNode* slow = head;
int count = 0;
// 这个判断条件写错了,应该是 fast->naxt != nullptr
while(fast->next != nullptr)
{
++count;
if(count >= k) slow = slow->next;
fast = fast->next;
}
return slow;
}
};
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) :val(x), next(NULL) {};
};
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k)
{
vector<ListNode*> pNode;
ListNode* pTemp = head;
while (pTemp)
{
pNode.push_back(pTemp);
pTemp = pTemp->next;
}
//end()函数返回的是指向容器或者string对象的尾元素的下一个位置的迭代器,因此不用+1
//注意返回的是迭代器,需要解引用才能取得对应于迭代器的元素
//前面加* 表示返回迭代器所值元素的引用
return *(pNode.end() - k );
}
};
int main()
{
vector<int> nums{ 2, 3, 1, 0, 2, 5 };
ListNode pHead1 = ListNode(1);
ListNode pHead2 = ListNode(2);
ListNode pHead3 = ListNode(3);
ListNode pHead4 = ListNode(4);
ListNode pHead5 = ListNode(5);
pHead1.next = &pHead2;
pHead2.next = &pHead3;
pHead3.next = &pHead4;
pHead4.next = &pHead5;
Solution s1;
ListNode* heand=s1.getKthFromEnd(&pHead1, 1);
Solution s1;
return 0;
}

本文探讨了如何在链表中找到倒数第k个节点,提供了两种高效的解决方案:一次遍历双指针法和两次遍历计数法,并通过示例代码展示了实现过程。
443

被折叠的 条评论
为什么被折叠?



