/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 blank //方法一(有些难): //首先判空 //新建快慢指针指向第一个节点 //在快指针走k个节点的过程中,判断快指针是否指向NULL(因为如果有小于k个节点,在这过程中快指针会指向NULL),是则返回NULL。否则进行下一步 //然后慢指针和快指针同时移动,当快指针指向NULL时,此时的慢指针指向的节点即为链表倒数第k个节点 * * * @param pHead ListNode类 * @param k int整型 * @return ListNode类 */ struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) { // write code here //首先判空 if(pHead == NULL) { return NULL; } //新建快慢指针 struct ListNode *fast = pHead, *slow = pHead; //快指针先走k个节点,判断链表长度是否小于k,小于则返回NULL。否则进行下一步 for(int i=0; i<k; i++) //退出循环且能执行下面的代码时,i=k,且fast指针指向链表的第k+1个节点,也可能是NULL { if(fast == NULL) //如果节点数小于k,就会出现fast == NULL { return NULL; } fast = fast->next; } //(画图理解)然后慢指针和快指针同时移动,此时慢指针指向第一个节点,他们之间相差k个节点,当快指针指向NULL时,此时的慢指针指向的节点即为链表倒数第k个节点 while (fast!=NULL) { slow = slow->next; fast = fast->next; } return slow; }