-------------------------------------三刷2021/2/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) {
if(head == NULL) return nullptr;
int count = 0;
ListNode* temp = head;
while(temp != NULL) {
count++;
temp = temp -> next;
}
int movTime = count - k;
while(movTime) {
head = head -> next;
movTime--;
}
return head;
}
};
题目描述
解法 单指针
如果这题放在面试的话,也许是考倒数第k个是哪一个的问题
先得到链表的长度len,然后倒数第k个就是第 len-k+1个
比如长度为5 [1,2,3,4,5],那么倒数第二个就是第4个即 5-2+1;
设len-k+1为count
如果使用
while(count--)
cur = cur -> next;//cur一开始为头指针
count需要减4次才等于0即cur会移动四次,即指向第五个
所以应该是
while(-- count)
cur = cur -> next;
下面贴代码
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
int len = 0;
ListNode *cur = head;
while(cur != nullptr) {
len ++;
cur = cur -> next;
}
cur = head;
int idx = len - k + 1;
while(-- idx) {
cur = cur -> next;
}
return cur;
}
};
时间复杂度O(n),空间复杂度O(1)