方法1:循环遍历
- 单链表长度为n,倒数第k个元素可以转化为正数n-k个
- 第一次遍历求解单链表的长度
- 第二次遍历查找正数n-k个元素
方法2:快慢指针
- 快指针移动k次,慢指针不动
- 快慢指针之间间距为k,然后再同时往后移动,每次移动1次,快慢指针保持等间距,当快指针的next为空,则慢指针为倒数第k个结点
#include <iostream>
using namespace std;
//结点
struct Node
{
int value;
Node* next;
};
//尾插法
Node* create_list(int v, int len)
{
Node* ret = NULL;
Node* slider = NULL;
for(int i=0; i<len; i++)
{
Node* n = new Node();
n->value = v++;//头结点
n->next = NULL;
if(slider == NULL)
{
slider = n;//slider和头结点挂接
ret = n;//ret指向头结点
}
else
{
slider->next = n; //尾插法
slider = n;//移动slider指向新插入的结点
}
}
return ret;//返回链表头结点
}
void destory_list(Node* list)
{
while(list)
{
Node* del = list;
list = list->next;
delete del;
}
}
void print_list(Node* list)
{
while(list)
{
cout << list->value << "->";
list = list->next;
}
cout << "NULL" << endl;
}
Node* find_kNode(Node* list, int k)
{
if(list == NULL || k == 0) //判断传入参数
return NULL;
Node* fast = list;
Node* slow = list;
for(int i=0; i<k; i++)
{
if(fast == NULL)
return NULL; //整个链表不足k个节点
fast = fast->next;
}
while(fast)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}
int main()
{
Node* list = create_list(1, 7);
Node* tmp = NULL;
print_list(list);
tmp = find_kNode(list,0);
cout << tmp->value << endl;
return 0;
}