题目:
给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来来找出链表中倒数第m个元素
补充:类似力扣 剑指 Offer 22. 链表中倒数第k个节点
https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
题解思路:
方法一:双指针
函数代码:
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *p=head;
ListNode *cur=head;
for(int i=0;i<k;i++)
{
p=p->next;
}
while(p)
{
cur=cur->next;
p=p->next;
}
return cur;
}
};
方法二:遍历两次,第一次遍历计算链表长度为len,第二次从头结点遍历到len-k;
函数代码二:
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *p=head;
ListNode *cur=head;
int len=0;
while(p)
{
p=p->next;
len++;
}
for(int i=0;i<len-k;i++)
{
cur=cur->next;
}
return cur;
}
};
函数代码三:双指针,快慢指针,遍历
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *fast = head;
ListNode *slow = head;
int i=0;
for(i=0;i<k;i++)
{
fast=fast->next;
}
while(fast!=nullptr)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
};