题目:
这种看上去需要得到链表长度再处理的题目,优先考虑一下快慢指针。我记得这种类型的题目也不是第一次做了。
类似的还有链表是否成环之类的问题。
这题直接让快慢指针中间相差的元素等于K就可以了。这样,当快指针遍历到NULLPTR时,慢指针之后的元素就是要输出的元素。直接让head=慢指针就可以。
此外,C++还需要考虑回收这一部分的内存。
但是不知道为什么还是没办法在LC里面跑通,自己的编译器里面确实是可以正确清理内存的。
C++代码附带测试:
#include<iostream>
#include<vector>
using namespace std;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(nullptr){}
};
ListNode* createList(int n){
ListNode* head = new ListNode(0);
ListNode* ptr = head;
for(int i=1;i<n;i++){
ListNode* p =new ListNode(i);
ptr->next = p;
ptr = ptr->next;
}
return head;
}
void display(ListNode* head){
ListNode* ptr = head;
while(ptr!=nullptr){
cout<<ptr->val<<" ";
ptr = ptr->next;
}
cout<<endl;
}
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* retrieve = head;//释放多余内存的指针
for(int i=0;i<k;i++){
p2 = p2->next;
}
while(p2!=nullptr){
p1 = p1->next;
p2 = p2->next;
}
while(retrieve!=p1){
ListNode* ptr = retrieve->next;
delete retrieve;
retrieve = ptr;
}
retrieve = nullptr;//垃圾回收完成之后防止悬空指针
head = p1;
return head;
}
};
int main(){
ListNode *head = createList(10);
display(head);
Solution solution;
head = solution.getKthFromEnd(head,3);
display(head);
}