题目描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。题目来源
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针。
要求: 1.正序构建链表 2.构建后要忘记链表长度
数据范围:链表长度满足1≤n≤1000,k≤n,链表中数据满足0≤val≤10000
本题有多组样例输入。
输入描述
输入链表结点个数
输入链表的值
输入k的值
输出描述:
输出一个整数
示例
输入:
8
1 2 3 4 5 6 7 8
4
输出:
5
思路
快慢双指针法:两个指针都在表头结点,快指针先走k步,走不到k说明链表不够长,fast==null,输出0。快指针走k步后,两个指针再同时向后走,直到fast==null时(while),slow指针所指的值为k对应的值。
-
定义链表结点。(记得初始化)
-
输入n,创建空的头结点,并保存。
-
输入val,并建立链表,用for循环将val一个一个存入链表中,正序建立链表。
-
输入k,定义快慢指针,找到slow对应的值,并输出。
具体实现
#include<iostream>
using namespace std;
struct ListNode{ //链表结点定义
int val;
ListNode* next;
ListNode():val(0),next(nullptr){} //初始化
ListNode(int x):val(x),next(nullptr){}
};
int main(){
int n,k,val;
while(cin>>n){
ListNode* head = new ListNode(); //创建空的,头结点
ListNode* cur = head; //保存头结点
for(int i=0; i<n; i++){ //正序建立链表
cin>>val;
ListNode* temp = new ListNode(val);
head->next = temp;
head = head->next;
}
cin>>k;
ListNode *fast = cur,*slow = cur; //定义快慢指针,并放在头结点处
for(int i=0; i<k;i++){
fast = fast->next;
}
while(fast!=NULL){
slow = slow->next;
fast = fast->next;
}
cout<<slow->val;
}
}
时间复杂度
-
时间复杂度:O(n),共遍历n个链表元素。
-
空间复杂度:O(1)。
小结
-
若想表示空指针,建议用nullptr,而不是NULL。
-
链表结点定义写法。(还有初始化!)
-
创建链表并赋值写法。
-
若相隔k个距离可建议用快慢指针法。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情