思路1:使用栈(内存大)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution{
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
// 弄一个栈存储每一个结点指针
stack<ListNode*> s;
ListNode* res;
while(head!=NULL){
s.push(head);
head = head->next;
}
while(k>1){
s.pop();
k--;
}
res = s.top();
return res;
}
};
思路2: 双指针(移动窗口,宽度为k)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution{
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
// 双指针,移动窗口,窗口宽度为k
// 举例k=3
// 1->2->3->4->5
// l.....r r先走(k-1)步,窗口宽度为k
// l.....r
// l......r r走到最后一个结点时,返回l即为倒数第k个指针
ListNode *l, *r;
l = r = head;
while(k>1){
r = r->next;
k--;
}
while(r->next!=NULL){
r = r->next;
l = l->next;
}
return l;
}
};