题目描述 输入一个链表,输出该链表中倒数第k个结点。
关于这个题目,有一个比较好的博客推荐https://www.cnblogs.com/General-up/p/5392358.html,它的分析部分特别清晰。
求链表的倒数第K个节点:主要思路设置两个指针,刚开始都指向链表的第一个节点,第一个指针先走k-1步,然后两个一块走,直到第一个指针的下一位为nullptr,则 第二个指针所指的位置就是倒数第k个节点。
尤其想说的是,大家一定要注意边界条件,我第一次在牛客上提交的时候,就是没有考虑 k = 0的情况,导致代码不通过。

呈上完整代码。
#include<iostream> #include<time.h> #include<stdlib.h> using namespace std; struct ListNode { int val; struct ListNode *next; ListNode(int n) : val(n), next(NULL) { }; }; ListNode *findKthToTail(ListNode *pListHead, unsigned int k) { if (k == 0) //当k为空时,返回为空 return NULL; if (pListHead == NULL) //当链表为空时,返回为空 return NULL; ListNode *first = pListHead; ListNode *second = pListHead; for (int i = 1; i < k; i++) { if (first->next == NULL) //当k的长度大于链表长度时,返回空 return NULL; first = first->next; } while (first->next != NULL) { first = first->next; second = second->next; } cout << "倒数第 " << k << " 个值为:" << second->val << endl; return second; } //创建结点数为n的单链表 ListNode* createList(int n) { ListNode *head; head = (ListNode*)malloc(sizeof(ListNode)); ListNode *q; q = head; srand(time(0)); for(int i = 0; i < n; i++) { ListNode *p = (ListNode*)malloc(sizeof(ListNode)); p->val = rand() % 100 + 1; q->next = p; q = p; } q->next = NULL; return head; } //打印单链表 void print(ListNode *head) { if (head == NULL) cout << "The list is NULL"; ListNode *p = head->next; while (p != NULL) { cout << p->val << " "; p = p->next; } cout << endl; } int main() { int n = 10; ListNode *singleList = NULL; singleList = createList(n); print(singleList); findKthToTail(singleList, 3); system("pause"); return 0; }