输入一个链表,输出该链表中倒数第k个结点。
思路一:先遍历整个链表,统计链表的个数,然后总个数-k就是所求的结果
但是太无脑了
所以思路二:
用两个指针, first 和 second
first先走k-1次,然后second再走,当first 到最后一个,second就是所求的了
代码:
// 两个指针,一个在前(先走k-1次),第二个在走 //当第一个到头了,第二个就是倒数k个 class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead == nullptr ||k <= 0) return nullptr; ListNode *first = pListHead; ListNode *second = pListHead; for(int i = 0; i < k-1; i++) { if (first->next != nullptr) first = first->next; else return nullptr; } while(first->next != nullptr) { first = first->next; second = second->next; } return second; } };
/* 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 == nullptr ||k <= 0) return nullptr; int num = 1; ListNode *p1 = pListHead; ListNode *p2 = pListHead; while(p1->next != nullptr) { num++; p1 = p1->next; } int t = num-k; if (t < 0) return nullptr; while(t--) { p2 = p2->next; } return p2; } };