输出该单链表的中间结点的值,如果链表长度为偶数,则输出中间靠右的结点

输出该单链表的中间结点的值,如果链表长度为偶数,则输出中间靠右的结点

题目要求:
输入数据创建一个单链表,实现一种算法。输出该单链表的中间结点的值,如果链表长度为偶数,则输出「中间靠右」的结点。如果链表只有一个元素,则输出唯一的元素。

算法思路:

  1. 创建一个单链表
  2. 设置两个指针,一个快指针fast,一个慢指针slow;
  3. 当快指针所指向的数据以及它所指向的下一个数据为空时,慢指针指向中间元素。
#include <iostream>
#define LIST_INIT_SIZE 100
#define Elemtype int
#define NULL 0

typedef struct LNode
{
    Elemtype data;
    struct LNode* next;
}LNode, * LinkList;

//创建一个单链表
LNode* CreatLinklist(void) {
    LinkList head = (LNode*)malloc(sizeof(LNode));//定义头结点
    head->data = 0;//初始化头结点,因为head->data指的是int,所以需要赋值一个具体的int
    head->next = NULL;//头结点指向NULL

    LNode* p = head;
    printf("请输入链表的长度:");
    int n;
    scanf_s("%d", &n);

    printf("请输入链表:\n");
    for (int i = 0; i < n; i++) {
        LNode* cur = (LNode*)malloc(sizeof(LNode));//声明一个新结点
        int val;
        scanf_s("%d", &val);
        cur->data = val; // 输入的val值要赋值给cur
        cur->next = NULL;
        p->next = cur;
        p = p->next;
    }
    return head;//创建完链表之后需要返回单链表的头部
}

//求链表的长度
int ListLength(LinkList head, LinkList p) {
    int len = 0;
    p = head->next;
    while (p) {
        p = p->next;
        len++;
    }
    return len;
}

//寻找链表中间的值
int Middle(LinkList head, int n)
{
    LinkList fast = head->next;
    LinkList slow = head->next; // head->data是0,从head->next开始才是真正的链表

    while (fast != NULL && fast->next != NULL) {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow->data;
}


int main() {
    LinkList L;
    L = CreatLinklist();//创建新的单链表L

    printf("中间元素是:");
    int middle = Middle(L, ListLength(L, L));
    printf("%d", middle);

    return 0;
}

实验结果:
在这里插入图片描述
在这里插入图片描述
做题时遇到的问题:
1.在写创建单链表的函数时return 0,导致返回的值是空,后改为return head。
2.寻找中间值的函数原先是:
int Middle(LinkList head,int n)
{
LinkList fast = head->next; // 第一个结点是头结点,值我设为了-1当然设为什么都可以
LinkList slow = head->next; // 所以从head->next开始才是真正的链表
slow->next = NULL;
fast->next = NULL;

//当n是偶数时
if (n % 2 == 0) {
    slow = head;
    fast = head;
    for (; fast->next != NULL; fast = fast->next)
       fast = fast->next;
    slow = slow->next;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值