Practice4:
输入一个链表,输出该链表中倒数第k个结点。
S1:
简单解法
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (k == 0||!pListHead)return NULL;
ListNode* firstListNode = pListHead;
int num_total = 0;
while (pListHead) {
pListHead = pListHead->next;
++num_total;
}
if (k <= num_total) {
k = num_total - k;
while (k) {
firstListNode = firstListNode->next;
--k;
}
return firstListNode;
}
else {
return NULL;
}
}
};
S2:
牛客题解:
如下图:
我们从图中可以看出,倒数第k个节点与最后的空节点之间有2个指针,此时的2正好就是k,于是我们可以想到可以通过平移来到达最后的状态。
如图:
如果懂了上面的过程,接下来再说说具体编程要怎么写?
使用如图的快慢指针,首先让快指针先行k步,然后让快慢指针每次同行一步,直到快指针指向空节点,慢指针就是倒数第K个节点。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (!pListHead || k <= 0) return nullptr;
auto slow = pListHead, fast = pListHead;
while (k--) {
if (fast)
fast = fast->next;
else
return nullptr; //如果单链表长度 < K,直接返回
}
while (fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};