题解 | #链表中倒数第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
- 指针的使用语法
- 链表有很多需要判断的(节点数量因为一开始不可知,需要在遍历过程中及时判断下一个节点是否为空指针


