利用快慢指针原理:设置两个指针*search,*mid都指向单链表的头节点。其中*search的移动速度是*mid的两倍。当*search指向末尾节点的时候,mid正好就在中间了。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
node *next;
}node,*linkList;
void createlist(linkList &h,int len,int *array)
{
linkList p=(linkList)malloc(sizeof(node));
linkList q;
h->next = p;
p->data = array[0];
int i;
for(i=1;i<len;i++)
{
q = (linkList)malloc(sizeof(node));
q->data = array[i];
p->next = q;
p = p->next;
}
p->next = NULL;
}
void midnode(linkList &h)
{
linkList pmid = h->next;
linkList psearch = h->next;
while(psearch->next!=NULL)//此处先判断它的后一个是否为空,如果为空,那么
{ //psearch->next->next就没有意义了
if(psearch->next->next!=NULL)
{
psearch = psearch->next->next;
pmid = pmid->next;
}
else
psearch = psearch->next;
}
printf("中间元素是%d\n",pmid->data);
}
void print(linkList &h)
{
linkList p = h->next;
while(p!=NULL)
{
printf(" %d",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int array[]={2,4,5,6,7,8,3,22,11,34,26,10};
int len = sizeof(array)/sizeof(int);
linkList h=(linkList)malloc(sizeof(node));
createlist(h,len,array);
print(h);
midnode(h);
system("pause");
return 0;
}