### 这节的链表是无环的(有环的链表通过当前节点的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; } ```