略。。。。。
提升题的难度,不知道输入数据节点的个数。
方法一:对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素时,将该元素返回即可。
方法二:用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步,那么当 fast 快指针为null或快指针的next为null时退出循环,slow 必然位于中间。
方法二代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
LinkNode* next;
}LinkNode, * LinkList;
//尾插法建立单链表
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* pTail = L;
int num;
while (scanf("%d", &num) && num != -1) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = pTail->next;
pTail->next = pnode;
pTail = pnode;
}
}
//打印输出
void printLinkList(LinkList L) {
LinkNode* pCur = L->next;
while (pCur != NULL) {
printf("%d ", pCur->data);
pCur = pCur->next;
}
}
//用两个指针 slow 与 fast 一起遍历链表。
//slow 一次走一步,fast 一次走两步,那么当快指针为null或快指针的next为null时退出循环,slow 必然位于中间。
int searchMidNum(LinkList L) {
LinkNode* pslow = L->next;
LinkNode* pfast = L->next->next;
while (pfast != NULL && pfast->next != NULL) {
pslow = pslow->next;
pfast = pfast->next->next;
}
return pslow->data;
}
int main() {
LinkList L;
creatLinkList(L);
printf("中间位置元素为:%d", searchMidNum(L));
//printLinkList(L);
return 0;
}