输入一个链表,输出该链表中倒数第k个结点。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)

//第一次尝试:
//方法一:双循环,第一次循环计数,记为count;第二次循环找第count-k+1个节点;
//方法二:双指针,创建两个指针fast、slow,二者皆指向首节点,开始循环后,让fast往下走,等到fast走到第k个位置后,fast、slow同时向后走,等fast走到NULL,slow就是要找的
// 节点,然后return slow;
struct
ListNode* FindKthToTail(struct ListNode* pListHead, int k ) { //双循环 if(pListHead == NULL){ return pListHead; } struct ListNode* next = pListHead; struct ListNode* node = pListHead; int count = 0;
//循环计数
while(next){ next = next->next; count++; }
//如果发现节点个数比k小,那就直接返回NULL
if(count < k){ return NULL; }
//第二个循环找第count-k+1个节点 count
= count-k+1; while(--count > 0){ node = node->next; } return node; //双指针 if(pListHead == NULL){ return pListHead; } struct ListNode* fast = pListHead; struct ListNode* slow = pListHead; int count = 0,num = 0; while(fast){
//fast指针一直向下走 fast
= fast->next; count++,num++;
//当fast走到第count个位置时,slow指针向下走
if(count == k + 1){ count--; slow = slow->next; } }
//如果发现节点个数比k小,那就直接返回NULL;
if(num < k){ return NULL; } return slow; }