题解 | #链表中倒数第k个结点#
链表中倒数第k个结点
https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if (!pListHead||k<=0) { return nullptr; } auto slow=pListHead; auto fast =pListHead; while (k--) { if (fast) { fast=fast->next; }else { return nullptr; } } while (fast) { slow=slow->next; fast=fast->next; } return slow; } };
思路
首先想到的是,通过一次遍历判断链表结点数目,再用n-k得到应该向后经过几个指针
考虑时间复杂度的问题,采用快慢指针法,两个指针同时进行,考虑依据是:倒数第k个节点离最后位置有k个节点差距,只要让两个指针先保持k个节点差距再经过平移,使较为靠后的指针平移到末尾位置,此时就得到指向倒数第k个节点的指针
细节
- 在链表中,指针的定义要注意类型,可以使用auto
- 指针的使用语法
- 链表有很多需要判断的(节点数量因为一开始不可知,需要在遍历过程中及时判断下一个节点是否为空指针