基本思想:
解法一:O(n^2)
先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,第一次统计出链表中节点的个数n,第二次就能找到倒数第k个节点。
解法二:O(n)
只需一次遍历。设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候,p2指针刚好指向链表中的倒数第k个结点。
#include <iostream>
using namespace std;
typedef int ElemType;//数据类型模板
typedef struct Node//结点
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node * LinkList;
//建表
Node* creat_Link(Node *head)
{
int x;
Node *p,*q;
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
cin>>x;
while(x!=999)
{
p=(Node *)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->next=p;
q=p;
cin>>x;
}
return head;//建完表后返回头结点
}
//输出
void output_Link(Node * head)
{
if(head==NULL)
{
cout<<"空链表!"<<endl;
return;
}
Node *q;
q= head->next;
while(q!=NULL)
{
cout<<q->data<<" ";
q=q->next;
}
cout<<endl;
}
Node * foo(Node *head,int k)
{
if(head==NULL||k==0)
return NULL;
Node * p1=head;
Node * p2=NULL;
for(int i=0;i<k-1;++i)
{
if(p1->next!=NULL)
p1=p1->next;
else
return NULL;
}
p2=head;
while(p1->next!=NULL)
{
p1=p1->next;
p2=p2->next;
}
return p2;
}
void main()
{
Node *head=NULL;
Node * pHead=creat_Link(head);//建表
output_Link(pHead);//输出
Node * result = foo(pHead,3);
cout<<result->data<<endl;
}