#include <iostream>
#include <memory>
using namespace std;
typedef struct LinkList
{
int val;
shared_ptr<LinkList> next;//智能指针和普通指针不要混合使用 https://blog.csdn.net/flowing_wind/article/details/81301001
LinkList(int x) :val(x), next(nullptr)
{
}
}LinkList;
void create(shared_ptr<LinkList> list1)
{
shared_ptr<LinkList> ptr = list1;
for (int i = 0; i <10 ; i++)
{
shared_ptr<LinkList> temp = make_shared<LinkList>(i+1);
ptr->next = temp;
ptr = ptr->next;
}
}
void print(shared_ptr<LinkList> list1)
{
shared_ptr<LinkList> ptr = list1->next;
while (ptr)
{
cout << ptr->val << " ";
ptr = ptr->next;
}cout << endl;
}
void last_k(shared_ptr<LinkList> list,int k)
{
shared_ptr<LinkList> fast = list;
shared_ptr<LinkList> slow=list;
for (int i = 0; i < k; i++)
{
fast = fast->next;
}
while (fast)
{
fast = fast->next;
slow = slow->next;
}
cout<<slow->val<<endl;
}
int main()
{
shared_ptr<LinkList> list1 = make_shared<LinkList>(0);
create(list1);
print(list1);
last_k(list1, 5);
return 0;
}
剑指offer的一道题目,用两个指针,一个快指针,一个慢指针,快指针先走k步,等快指针走到null的时候,慢指针刚好到倒数第k个。
快慢指针用于保持差距,寻找有环链表,也可以,保证快指针和慢指针有一定距离的差距即可。