题目描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000 ,$ k \le n$,链表中数据满足 0 ≤ v a l ≤ 10000 0 \le val \le 10000 0≤val≤10000
本题有多组样例输入
输入描述:
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述:
输出一个整数
示例1
输入:
8
1 2 3 4 5 6 7 8
4
输出:
5
思路:
- 设置快慢指针, 就是快指针先前进 k步, 然后快慢指针一起往后遍历 直至快指针到链表末端( !=nullptr) 此时慢指针就是指向倒数第k个结点
复杂度
- O(n) (链表长度)
具体实现 (c++)
#include <iostream>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL){}
};
int main() {
int nums;
while(cin >> nums){ // 输入多组数据
ListNode *pHead = new ListNode(-1);
ListNode *p = pHead;
for(int i = 0; i<nums; i++){
int data;
cin>>data;
ListNode *q = new ListNode(data);
p->next = q;
p = p->next;
}
int kth = 0;
cin>>kth;
if(kth == 0) cout << 0<<endl; // 异常情况 处理下 若要的是倒数第0个结点
ListNode *fast = pHead->next, *slow = pHead->next;
for(int i = 0; i< kth; i++){
fast = fast->next;
}
while(fast != nullptr){
slow = slow->next;
fast = fast->next;
}
cout<<slow->val<<endl;
}
return 0;
}
小结
快慢指针用法很多 有待总结