{{format('0')}} {{format('777')}} {{format('2373')}}

【思考】从未知长度的单链表里,找到中间那个中间那个元素 [ 编程杂谈 ]

大数据男孩 文章 正文

想做一个技术博客,奈何实力不够
分享

明妃

{{nature("2022-08-14 17:23:19")}}更新

常规想法

遍历一遍单链表,记录长度

再一次遍历,输出中间元素

这样的效率不是最优

另一种方式(来源于网络)

search 的速度是 mid两倍search 走完恰好 mid 走一半

void printInt(intList *head){
    intList *mid,*search; // search 的速度是 mid 的两倍,search 走完恰好 mid 走一半

    mid = search = head;  // 保证 mid search 启点一样

    while (search->next != NULL){
        search = search->next;   // search 取下一个
        if (search->next != NULL){
            search = search->next;  // search 再去下一个
            mid = mid->next;     // mid 就取一次
        }else{
            mid = mid->next;     // search 取到头,mid 再往下取一位
        }
    }

    printf("\n %d ",mid->num);
}

完整代码

  • 随机生成任意长度单链表
  • 输出单链表值
  • 输出位于中间的值
  • 奇数个最中间值偶数个中间两个的 前一个
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct IntList{
    int num;
    struct intList *next;
} intList;

intList *applyList(); // 生成随机长度单链表
void printList(intList *head); // 查看单链表
void printInt(intList *head); // 输出单链表中间值

intList *applyList(){
    srand((unsigned)time(NULL));
    int len = rand() % 10 + 10; // 10 到 20的随机数

    intList *head = (intList *)malloc(sizeof(intList));
    if (head == NULL)exit(-1); // 链表头部申请失败
    head->next = NULL;

    while(len){
        intList *node = (intList *)malloc(sizeof(intList));
        node->num = rand() % 10 + 20;
        node->next = head->next;
        head->next = node;
        len--;
    }
    return head;
}

void printList(intList *head){
    intList *t = head->next;
    while(t){
        printf("%d ",t->num);
        t = t->next;
    }
};

void printInt(intList *head){
    intList *mid,*search; // search 的速度是 mid 的两倍,search 走完恰好 mid 走一半

    mid = search = head;  // 保证 mid search 启点一样

    while (search->next != NULL){
        search = search->next;   // search 取下一个
        if (search->next != NULL){
            search = search->next;  // search 再去下一个
            mid = mid->next;     // mid 就取一次
        }else{
            mid = mid->next;     // search 取到头,mid 再往下取一位
        }
    }

    printf("\n %d ",mid->num);
}

int main()
{
    intList *list = applyList(); // 随机生成单链表
    printList(list); // 查看链表的值
    printInt(list);  // 输出中间值
    return 0;
}

[mark]()

评论 0
0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}
TOP 2
Spark 2.0 单机模式与集群模式 安装

{{nature('2020-01-02 16:47:07')}} {{format('12641')}}人已阅读

TOP 3
Office 2016 Pro Plus 激活

{{nature('2019-12-11 20:43:10')}} {{format('9527')}}人已阅读

TOP 4
Linux上 MySQL 开启远程登陆的两种方法

{{nature('2019-12-26 17:20:52')}} {{format('7573')}}人已阅读

TOP 5
Linux 安装 MySQL 5.7

{{nature('2019-12-26 16:03:55')}} {{format('5017')}}人已阅读

目录

标签云

C语言 数据结构与算法 思考

一言

# {{hitokoto.data.from || '来自'}} #
{{hitokoto.data.hitokoto || '内容'}}
作者:{{hitokoto.data.from_who || '作者'}}
自定义UI
配色方案

侧边栏