思路:

双指针法:两个指针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;
}