一、题目描述

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

二、分析解答

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

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§{
    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;
}

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

#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;}

寻找链表中值域最小的节点并移到链表的最前面相关推荐

  1. 数据结构与算法--两个链表中第一个公共节点

    链表中第一个公共节点 公节点定义:同一个节点在两个链表中,并不是节点值相同 题目:输入两个节点,找出他们的第一个公共节点,节点定义如需 /*** 链表元素节点** @author liaojiamin ...

  2. 【 C 】在单链表中插入一个新节点的尝试(二)

    在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...

  3. 【 C 】在单链表中插入一个新节点的尝试(一)

    根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...

  4. 通过一趟遍历找出长度为n的单链表中值最大的节点.【数据结构】【单链表】

    编写一个函数完成如下功能:通过一趟遍历找出长度为n的单链表中值最大的节点. 要求,在主函数中调用上面的函数测试. 提示:还需要定义其他函数,比如初始化链表,构造单链表,输出单链表. 输出结果: 代码展 ...

  5. C++ 单链表基本操作分析与实现 链表   链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结

    C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以 ...

  6. 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

    前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...

  7. 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...

    链表的操作总结   链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...

  8. Leetcode 剑指offer 22. 链表中第k个节点 (每日一题 20210716)

    输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6. ...

  9. java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点

    // 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...

最新文章

  1. 微信小程序wx.request POST获取不到数据解决办法
  2. mysql 查询后怎么定位列_MySQL如何定位并优化慢查询sql
  3. Chrome 90 里更好的字符串处理机制
  4. 构建Spring微服务并对其进行Dockerize生产
  5. 【pytorch】torch.nn.Identity()
  6. Windows的特色
  7. php字符串转二进制数组中,如何将php字符串转成二进制
  8. 浅谈linux线程模型和线程切换
  9. JavaSE(二):Java语法(5)——Java数据类型转换
  10. 串行通信接口详细描述
  11. Win11如何增强麦克风?Win11增强麦克风的设置
  12. 错误处理panic和recover
  13. 身份证实名认证API接口介绍
  14. 不停机与停机更新_Kubernetes的零停机滚动更新
  15. 为Greenplum 增加mirror节点
  16. odbc sqlstate:IM004
  17. 杀毒软件McAfee导致客户端访问mscrm超慢
  18. uniapp 浙政钉埋点——小程序
  19. python基础教程视频纸飞机_蜗牛笔记-文章-全年专题直播课四月课表正式上线!​...
  20. Nmap的介绍、安装 并进行网络扫描

热门文章

  1. LeetCode 71. Simplify Path
  2. 【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences
  3. 剑指offer——面试题63:二叉搜索树的第k个结点
  4. Rust之字符串,元组,数组,切片,打印优化
  5. 关于滑动窗口的小小小tip
  6. Ubuntu18.04快捷键
  7. python 视频转换为图像,图像转换为视频
  8. selenium课程笔记3-使用selenium中的webdriver对浏览器操作-页面元素定位及操作
  9. 昨晚做了个flash
  10. java 使用 lamba 表达式处理二维数组