数据结构链表的中间结点

发布于:2022-12-02 ⋅ 阅读:(384) ⋅ 点赞:(0)

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");
} 
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到