方法一:普通方法
#include"pch.h"
#include <stdio.h>
#include <stdlib.h>
//声明结点
typedef struct nodew
{
char data;
struct node* next;
} LinkList;
//尾插法建立单链表
LinkList *CreateLinkR();
//求单链表长度
int Length(LinkList *head);
//读取L/2位置的元素
char GetHalf(LinkList *head, int L);
int main()
{
LinkList *head;
int L; //L:链表长度
char ch; //中间结点的值
head = CreateLinkR(); //尾插法建立单链表
L = Length(head);
ch=GetHalf(head,L);
printf("%c", ch);
}
LinkList *CreateLinkR()
{
LinkList *head, *p,*r;
char ch;
head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
r = head;
while ((ch = getchar()) != '\n')
{
p= (LinkList*)malloc(sizeof(LinkList));
p->data = ch;
r->next = p;
r = p;
}
r->next = NULL;
return head;
}
int Length(LinkList *head)
{
int L=1; //计数器L
LinkList *p;
p = head->next;
while (p->next)
{
L++;
p = p->next;
}
return L;
}
char GetHalf(LinkList *head,int L)
{
int i = 1;
LinkList *p;
p = head->next;
while (p->next&&i!=L/2+1)
{
i++;
p = p->next;
}
return p->data;
}
方法二:快慢指针
char GetHalf(LinkList *head,int L)
{
LinkList *mid,*search;
mid = head->next; search = head->next;
while (search->next!= NULL) //*search指到最后一个结点,跳出循环
{
if (search->next->next != NULL) //快慢指针
{
mid = mid->next;
search = search->next->next;
}
else //保证search移动到最后一个结点
search = search->next;
}
return mid->data; //返回中间结点的值
}