寻找链表中值域最小的节点并移到链表的最前面
一、题目描述
已知线性链表由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;}
寻找链表中值域最小的节点并移到链表的最前面相关推荐
- 数据结构与算法--两个链表中第一个公共节点
链表中第一个公共节点 公节点定义:同一个节点在两个链表中,并不是节点值相同 题目:输入两个节点,找出他们的第一个公共节点,节点定义如需 /*** 链表元素节点** @author liaojiamin ...
- 【 C 】在单链表中插入一个新节点的尝试(二)
在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...
- 【 C 】在单链表中插入一个新节点的尝试(一)
根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...
- 通过一趟遍历找出长度为n的单链表中值最大的节点.【数据结构】【单链表】
编写一个函数完成如下功能:通过一趟遍历找出长度为n的单链表中值最大的节点. 要求,在主函数中调用上面的函数测试. 提示:还需要定义其他函数,比如初始化链表,构造单链表,输出单链表. 输出结果: 代码展 ...
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以 ...
- 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...
前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...
- 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...
链表的操作总结 链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...
- Leetcode 剑指offer 22. 链表中第k个节点 (每日一题 20210716)
输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6. ...
- java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点
// 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...
最新文章
- 微信小程序wx.request POST获取不到数据解决办法
- mysql 查询后怎么定位列_MySQL如何定位并优化慢查询sql
- Chrome 90 里更好的字符串处理机制
- 构建Spring微服务并对其进行Dockerize生产
- 【pytorch】torch.nn.Identity()
- Windows的特色
- php字符串转二进制数组中,如何将php字符串转成二进制
- 浅谈linux线程模型和线程切换
- JavaSE(二):Java语法(5)——Java数据类型转换
- 串行通信接口详细描述
- Win11如何增强麦克风?Win11增强麦克风的设置
- 错误处理panic和recover
- 身份证实名认证API接口介绍
- 不停机与停机更新_Kubernetes的零停机滚动更新
- 为Greenplum 增加mirror节点
- odbc sqlstate:IM004
- 杀毒软件McAfee导致客户端访问mscrm超慢
- uniapp 浙政钉埋点——小程序
- python基础教程视频纸飞机_蜗牛笔记-文章-全年专题直播课四月课表正式上线!​...
- Nmap的介绍、安装 并进行网络扫描
热门文章
- LeetCode 71. Simplify Path
- 【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences
- 剑指offer——面试题63:二叉搜索树的第k个结点
- Rust之字符串,元组,数组,切片,打印优化
- 关于滑动窗口的小小小tip
- Ubuntu18.04快捷键
- python 视频转换为图像,图像转换为视频
- selenium课程笔记3-使用selenium中的webdriver对浏览器操作-页面元素定位及操作
- 昨晚做了个flash
- java 使用 lamba 表达式处理二维数组