数据结构 - 将数据域中最小的节点移动的单链表的最前面

作者: 主教主

一、题目描述

已知线性链表由list指出,链节点的构造为(data,next),请写一个算法,将链表中数据域值最小的那个节点移动到链表的最前面。(不能申请额外的节点)(本文转载 更好的阅读体验,请访问程序员在旅途

二、分析解答

主要解题思路就是,遍历链表,找到最小的那个节点min,以及该节点的前驱pre_min,然后将其移到链表的最前面。
值得注意的是,由于节点结构要求的是单向单链表,因此,如果要移动min,必须要找到他的前驱。如果是双向链表,就可以不用记录前驱结点了。

主要代码

void Move_Min_To_First(LinkList *L)
{
    LinkList *pre_p = L->next,*p = pre_p->next;
    LinkList *pre_min = L,*min = L->next;

    while(p->next!=NULL)
    {
        if(min->data>p->data)
        {
            min = p;
            pre_min = pre_p;
        }
        pre_p = p;
        p = p->next;
    }
    pre_min->next = min->next;
    min->next = L->next;
    L->next = min;
    return 1;

}

完整可执行程序代码如下:

点击查看代码

include<stdio.h>
include<stdlib.h>

typedef struct node{

    int data;
    struct node *next;

}Node,*PNode;


/*

  方法思路:
          遍历链表,找到其中最小的元素节点及其前驱结点,然后将最小的节点放置在链表最前面。

  返回值:
      -1 链表为空,无法寻找;
      0  查找失败;
      1查找成功。

*/

int move_min_to_first(PNode head){

    PNode pre_p = head->next, p = pre_p->next;

    //将最小的元素节点及其前驱记录下来
    PNode pre_min = head, min = pre_p;

    //判断链表是否为空
    if(head == NULL || head->next == NULL){

        return -1;
    }

    //遍历链表,寻找最小元素节点
    while(p){

        if(min->data > p->data){

            pre_min = pre_p;
            min = p;

        }

        pre_p = p;
        p = p->next;

    }

    //移动到链表的最前面
    pre_min->next = min->next;
    min->next = head->next;
    head->next = min;

    return 1;

}

//头插法建立带有头结点的单链表
PNode creat_list(){

    //申请头结点
    PNode head = (PNode)malloc(sizeof(Node));

    head->next = NULL;
    scanf("%d",&(head->data)); // 头结点的数据域可以存放总结点数

    //新增元素
    PNode p =  NULL;
    int i;
    for(i=0;i<(head->data);i++){

        p = (PNode)malloc(sizeof(Node));

        scanf("%d",&(p->data));

        //这是头插法的关键所在
        p->next = head->next;
        head->next = p;

    }
    return head;

}

void print_list(PNode head){

        PNode p = head->next;

        while(p){

            printf("p->data: %d \t",p->data);

            p = p->next;

        }
        printf("\n");

}
  int main(){

      PNode head = creat_list();

      print_list(head);

      move_min_to_first(head);

      print_list(head);

      return 0;

  }

原文创作:主教主

原文链接:https://www.cnblogs.com/zhujiaozhu/p/15389243.html

更多推荐

更多
  • Azure数据工程指南-二十四、数据治理的权限 创建 azure 预览帐户,探索 azure 预览,探索词汇表,浏览资产,以编程方式使用预览,摘要,管理凭证和访问,创建扫描, 许多组织需要建立数据治理流程、标准和方法,并且已经能够使用内部 SQL Server 工具(如 Master
    Apache CN

  • Azure数据工程指南-二十二、Synapse 分析工作区 创建 Synapse 分析工作区,使用 Spark 探索样本数据,用 SQL 查询数据,用 SQL 创建外部表,摘要, 微软 Azure 数据平台的众多新增功能已经围绕许多类似的产品及其在现代 Azure 数据平台中的用途产生了兴奋和困
    Apache CN

  • Azure数据工程指南-二十三、数据块中的机器学习 创建 MLflow 实验,安装 MLflow 库,创建笔记本,选择性测井,自动记录,摘要, 寻求利用机器学习(ML)和人工智能能力的组织和开发人员花费大量时间构建 ML 模型,并寻求一种方法来简化他们的机器学习开发生命周期,以跟踪实验,
    Apache CN

  • Azure数据工程指南-二十一、将 Apache Spark 的 GraphFrame API 用于图形分析 安装 JAR 库,加载新数据表,将数据加载到数据块笔记本中,用顶点和边构建一个图,查询图表,寻找有图案的图案,用 PageRank 发现重要性,探索入度和出度度量,摘要,进行广度优先搜索,查找连接的组件, 图形技术使用户能够以图形的形式
    Apache CN

  • Azure数据工程指南-20 二十、部署 SQL 数据库先决条件,创建 Visual Studio SQL 数据库项目,安装 Visual Studio GitHub 扩展,导入 AdventureWorks 数据库,连接到 GitHub Repo 源代码控制,将
    Apache CN

  • Azure数据工程指南-十九、部署数据工厂更改 先决条件,创建 DevOps 持续集成构建管道,创建 DevOps 持续部署发布渠道,验证部署的数据工厂资源,摘要,Azure PowerShell 任务停止触发器,ARM 模板部署任务,Azure PowerShell 任务启动触发器
    Apache CN

  • Azure数据工程指南-十八、用于 Cosmos DB 的 Azure Synapse 链接 创建一个 Azure Cosmos DB 帐户,启用 Azure Synapse 链接,创建一个 Cosmos DB 容器和数据库,将数据导入 Azure Cosmos DB,在 Azure Synapse Analytics 中创建
    Apache CN

  • Azure数据工程指南-十六、流分析异常检测 先决条件,创建流分析输入和输出,创建实时电源 BI 仪表板,监控实时电源 BI 流,摘要,创建 Azure 流分析作业,创建物联网中心,创建 Power BI 服务,下载设备模拟器,添加流输入,添加流输出,编写流分析查询,启动流分析作业
    Apache CN

  • Azure数据工程指南-十七、使用 Apache Spark 的实时物联网分析 先决条件,创建物联网中心,创建数据块集群,安装 Maven 库,创建笔记本并运行结构化流查询,摘要,配置笔记本连接,开始结构化流,启动物联网设备模拟器,显示实时流数据,创建 Spark SQL 表,将流写入增量表, 实时物联网分析、高级
    Apache CN

  • Azure数据工程指南-十五、DeltaLake 为什么是酸性 DeltaLake,先决条件,创建并插入 DeltaLake,更新 DeltaLake,从 DeltaLake 删除,浏览增量日志,摘要,插入,更新,删除, 在使用 Azure Data Lake Storage Gen2
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多