题解 | #链表中倒数最后k个结点#
链表中倒数最后k个结点
https://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9
1.翻转链表去做,然后按照这个顺序找第k-1个数,然后在与原来的链表进行对比
2.这里要考虑到深拷贝和浅拷贝的问题,同时还要考虑到k为零的情况
3.做法比较复杂
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead ListNode类 * @param k int整型 * @return ListNode类 */ //翻转链表 ListNode* reverseList(ListNode* L1) { if(L1 == nullptr) return nullptr; //ListNode* newList; //链表原地翻转时会连着以前的链表一起翻转 ListNode* pre = nullptr; ListNode* cur = L1; //cur->next = nullptr; while(cur != nullptr) { //以cur作为中间中转点 ListNode* next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; } ListNode* FindKthToTail(ListNode* pHead, int k) { // write code here //翻转链表,然后再迭代k次,采用原地翻转的形式 if(k == 0 ) { return {}; } if(pHead == nullptr) return nullptr; //ListNode* newList,这里涉及到深拷贝和浅拷贝的问题 ListNode* cpHead = new ListNode(-1); cpHead = pHead; //做一个深拷贝,防止翻转的时候出现问题 ListNode* deepCopy = new ListNode(-1); ListNode* go = deepCopy; while(cpHead != nullptr) { ListNode* temp = new ListNode(cpHead->val); go->next = temp; go = go->next; cpHead = cpHead->next; } deepCopy = deepCopy->next; //深拷贝已构造完毕 cpHead = pHead; ListNode* pre = reverseList(cpHead); cpHead = deepCopy; for(int i = 0; i < k - 1; i++) { pre = pre->next; if(pre == nullptr) return {}; } //找到与原拷贝节点相同的位置开始 while(pre->val != deepCopy->val) { deepCopy = deepCopy->next; if(deepCopy == nullptr) return {}; } return deepCopy; } };