题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
http://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
#include<bits/stdc++.h>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
//三种不同参数的构造函数
ListNode() : val(0), next(nullptr) {}
ListNode(int x):val(x), next(nullptr){};
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
int nodeVal(ListNode*, int); //函数提前声明一下
int main(){
int n,val,num;
while(cin>>n){
ListNode* head=new ListNode(-1);//正序构建链表
ListNode* p=head;
for(int i=0;i<n;i++){
cin>>val;
ListNode* tmp=new ListNode(val);
p->next=tmp;
p=p->next;
}
cin>>num;
int res=0;
if(num>=1)
res=nodeVal(head->next,num);//因为创建的是带头节点的单链表(head没有实际意义),
//所以传入的参数是head->next, 而不是head
cout<<res<<endl;
}
return 0;
}
//查找链表的倒数第k个节点[逆序]
int nodeVal(ListNode* head, int k){
ListNode* fast = head;
ListNode* slow = head;
for(int i = 0; i < k; i++){ //快指针先行k步
fast = fast->next;
}
while(fast != nullptr ){ //快慢指针同步,快指针先到底,慢指针指向倒数第k个
fast = fast->next;
slow = slow->next;
}
return slow->val;
}