思路:
双指针法:两个指针res和real同时指向链表的头结点head(空头结点),然后让real指针向后移动k的节点,然后res和real节点开始同步向后移动,当real节点指向链表的尾节点的后一个位置即空节点的时候,此时res指针所指的节点即为倒数第k的节点。
代码:
#include<bits/stdc++.h>
using namespace std;
struct ListNode{
int m_nKey;
ListNode *m_pNext;
};
int main(){
ListNode *head=new ListNode;
head->m_pNext = NULL;
int count; // 链表结点个数
int k;
while(cin>>count){
ListNode *real = head;
// 输入结点
for (int i = 0; i < count; i++){
ListNode *tmp = new ListNode;
int a;
cin >> a;
tmp->m_nKey=a;
tmp->m_pNext = NULL;
real->m_pNext = tmp;
real = real->m_pNext;
}
// 输入k值
cin >> k;
if(k>count){
continue;
}
// 双指针法
int step = 0;
ListNode *res = head;
real = head;
// 让real指针先走k步
for (int i = 0; i < k; i++){
real = real->m_pNext;
}
// 当real指针走到链表结尾处的下一个节点时,此时,res指针所指向的节点就是倒数第k个节点
while(real){
real = real->m_pNext;
res = res->m_pNext;
}
cout << res->m_nKey << endl;
}
return 0;
}