找链表中间元素
简介:
#include <iostream>#include <string>using namespace std; typedef struct LNode{ int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 LinkList findmiddle(LinkList L){ LinkList p ,q; p = L; //p为快指针,初始时指向L q = L; //q为慢指针,初试时
#include <iostream>
#include <string>
using namespace std;
typedef struct LNode
{
int date; //节点的数据域
struct LNode *next; //节点的指针域
}LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型
LinkList findmiddle(LinkList L)
{
LinkList p ,q;
p = L; //p为快指针,初始时指向L
q = L; //q为慢指针,初试时指向L
while(p!=NULL&&p->next != NULL) //确保p可以走俩步
{
p = p->next->next; //快指针一次走俩步
q = q->next; //慢指针一次走一步
}
return q;
}
void CreateList_R(LinkList &L) //尾插法创建单链表 (尾插法是正序建表)
{
//输入n个元素,建立到头结点的单链表
int n ;
LinkList s, r;
L = new LNode;
L->next = NULL; //先建立一个带头结点的空链表
r = L; //尾指针r指向头结点 (就他自己)
cout<<"请输入元素个数 n: "<<endl;
cin>>n;
cout<<"请依次输入n个元素:"<<endl;
cout<<"前插法创建单链表..."<<endl;
while(n--)
{
s = new LNode ; //生成新结点s
cin>>s->date; //输入元素赋值给新结点的数据域
s->next = NULL;
r->next = s; //将新结点插s插入尾结点*r之后
r = s; //r指向新的尾结点s
}
}
void listprint_L(LinkList L) //单链表的输出
{
LinkList p;
p = L->next;
while(p)
{
cout<<p->date<<"\t";
p = p->next;
}
cout<<endl;
}
int main()
{
LinkList L,mid;
CreateList_R(L);
mid = findmiddle(L);
cout<<mid->date<<endl;
}