0 题目
输入一个链表,输出该链表中倒数第k个结点。
1 分析
经典的双指针题。
一个指针,当k==0的时候,每次循环向下走一步,知道另一个指针为nullptr
ListNode *FindKthToTail(ListNode *pListHead, unsigned int k) { ListNode *ret = pListHead; ListNode *end = pListHead; while (end != nullptr) { if (k == 0) { //ret 在k=0的时候,表示 end 已经先走了k步 ret = ret->next; } else { --k; } end = end->next; } // 在end==nullptr 的时候k还不为0 ,也就是end还没走上k步。 // 也就是说链表长度不足k if (k != 0) { return nullptr; } else { return ret; } }
或者是另一种写法
ListNode *FindKthToTail(ListNode *pListHead, unsigned int k) { ListNode *pre = pListHead; ListNode *cur = pListHead; // pre 先走k步,如果pre==nullptr那么就return nullptr // 原因在于链表没有k那么长 for (int i = 0; i < k; i++) { if (pre == nullptr) { return nullptr; } pre = pre->next; } while (pre != nullptr) { pre = pre->next; cur = cur->next; } return cur; }