### 这节的链表是无环的(有环的链表通过当前节点的m_next 是不是环的入口节点来判断有没有到达最后一个节点,为什么要判断到达最后一个节点,请看下面的思路)。
### 思路:先说明一点,k 从 1 开始计数,所以没有倒数第 0 个节点。利用链表节点的距离(两个节点可以通过几步到达,相邻节点可以通过一个m_next直接到达,所以步数是 1)不会变的特点,倒数第 k 个节点通过 k - 1 步可以到达最后一个节点,那么如果有两个指针,一个从链头出发,一个先从链头走 k - 1 步, 然后两个指针同时向前走,当前面一个指针到达最后一个节点时,那么后面一个指针就是倒数第 k 个节点。
下面是代码实现:
```
SList* findLastKthNode(SList *list, unsigned int k)
{
if (list == nullptr || k == 0) {
return nullptr;
}
SList *slow = list, *fast = list;
// 快指针先走 k - 1 步
for (unsigned int i = 0; i < k - 1; ++i) {
if (fast->m_next != nullptr) {
fast = fast->m_next;
} else { // k 大于链表的长度
return nullptr;
}
}
// 同时走,有环的话判断条件得改为fast->m_next != 环入口点
while (fast->m_next != nullptr) {
fast = fast->m_next;
slow = slow->m_next;
}
return slow;
}
```