美文网首页
寻找链表中值域最小的节点并移到链表的最前面

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

作者: IT之旅 | 来源:发表于2020-07-05 18:45 被阅读0次

一、题目描述

        已知线性链表由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(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;
}

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

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

相关文章

  • 寻找链表中值域最小的节点并移到链表的最前面

    一、题目描述 已知线性链表由list指出,链节点的构造为(data,next),请写一个算法,将链表中数据域值最小...

  • 链表类算法题汇总

    算法题目中常考察的链表操作无非以下几种: 链表反转 链表合并 寻找链表中点 寻找链表倒数第 K 个节点 删除链表节...

  • 链表的创建(头插法,尾插法)

    尾插法创建链表 头插法创建链表 打印链表 删除节点 按升序创建链表,Head是虚头节点 检索链表,并返回节点指针

  • 反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

  • 2022-02-23 链表专栏

    链表基础 类别 1、合并两个有序链表2、合并 k 个有序链表3、寻找单链表的倒数第 k 个节点4、寻找单链表的中点...

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • 数据结构与算法之链表面试题(四)

    目录 删除链表中的节点反转一个链表递归实现迭代(非递归)实现 一 删除链表中的节点 237. 删除链表中的节点 说...

  • LeetCode 每日一题 [55] 反转链表

    LeetCode 反转链表 [简单] 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 来...

  • 单向链表移动

    给定一个单链表,旋转链表,将链表每个节点向后移动 k 个位置,如果是尾节点,则把它移动到最前面;其中 k 是正数。...

  • 实战高频leetcode题目

    1. 反转链表 : 反转链表是常见简单题目,定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点...

网友评论

      本文标题:寻找链表中值域最小的节点并移到链表的最前面

      本文链接:https://www.haomeiwen.com/subject/ivzvqktx.html