2022.10.02这道题是测试最多的一个,一共12组才开始没有处理好双数取后导致6组正确QAQ,代码一改就直接又试n遍。
任务描述
本关任务:给定一个头结点为 L 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例一:
输入:1 2 3 4 5
输出:返回的结点值为 3 。
示例二:
输入:1 2 3 4 5 6
输出:返回的结点值为 4。
由于该链表有两个中间结点,值分别为 3 和 4,我们返回第二个结点 4。
编程要求
根据提示,在右侧编辑器补充代码,完成函数LinkNode* middleNode(LinkNode *L),该函数的功能是返回链表的中间结点。其中L为不带附加头结点的单链表的头指针。
测试说明
平台会对你编写的代码进行测试:
测试输入:
1 2 3 4 5
预期输出:
3
测试输入:
1 2 3 4 5 6
预期输出:
4
提示:
给定链表的结点数介于 1 和 100 之间。
开始你的任务吧,祝你成功!
C++代码
#include "linklist.h"
/**
* 返回链表的中间结点。L为不带附加头结点的单链表的头指针。
*/
LinkNode* middleNode(LinkNode *L)
{
//请在下面编写代码
/******************Begin******************/
int n=0;
LinkNode *cur=L;
while(cur!=NULL)
{
++n;
cur=cur->next;
}
int k=0;
cur=L;
while(k<n/2)
{
++k;
cur=cur->next;
}
return cur;
/*******************End*******************/
}
//尾插法建立不带附加头结点的单链表
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
LinkNode *s, *r;
L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->data = a[0];
L->next = NULL;
r = L; //r始终指向终端结点,开始时指向头结点
for (int i = 1; i < n; i++)
{
s = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点s
s->data = a[i];
r->next = s; //将结点s插入结点r之后
r = s;
}
r->next = NULL; //单链表收尾
}
//输出单链表
void DispList(LinkNode *L)
{
LinkNode *p = L;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}