您的位置:首页 > 其它

用标尺法快速找到单链表的中间结点

2016-03-19 20:20 453 查看
设置两个工作指针search、*mid都指向单链表的头节点。其中 search的移动速度是*mid的2倍。当*search指向末尾节点的时候,mid正好就在中间了。这也是标尺的思想。

// 找到链表的中间节点
Status GetMidNode(LinkList L, ElemType *e) {
LinkList search, mid;
mid = search = L;
while (search->next != NULL)
{
//search移动的速度是 mid 的2倍
if (search->next->next != NULL)
{
search = search->next->next;
mid = mid->next;
//printf("search %d\n", search->data);
//printf("mid %d\n", mid->data);
}
else
{
search = search->next;
}
}
*e = mid->data;
return OK;
}


附完整代码

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef int ElemType;
struct Node
{
ElemType data;
struct Node *next;
};
typedef Node LinkList;
Node* Create()
{
Node *head,*p,*q;
head=new Node;
head->next=NULL;
q=head;
int n,i;
double k;
cout<<"请输入您要创建的链表长度:";
cin>>n;
cout<<endl;
cout<<"请输入链表中每个结点保存的数据:";
for(i=0;i<n;i++)
{
cin>>k;
p=new Node;
p->data=k;
q->next=p;
q=p;
}
p->next=NULL;
cout<<endl<<"链表创建成功"<<endl;
return head;
}
bool Insert(LinkList *L,ElemType x,int i)
{
LinkList *p,*q=L,*s;
int k;
for(k=0;k<i;k++)
{
p=q;
q=q->next;
if(q==NULL) return false;
}
s=new Node;
s->data=x;
s->next=q;
p->next=s;

return true;

}
void ShowLink(LinkList *L)
{
Node *head,*p;
head=L;
p=head->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
return ;
}
int SearchMid(LinkList *L)
{
LinkList *p,*q;
p=q=L;
while(q->next!=NULL)
{
if(q->next->next!=NULL)
{
q=q->next->next;
p=p->next;
}
else {q=q->next;
p=p->next;
}

}
return p->data;

}
int main()
{
int k;
LinkList *L;
L=Create();
cout<<"显示创建的链表:";
ShowLink(L);
k=SearchMid(L);
cout<<"链表中间结点保存的数据为:"<<k<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: