首页 > 其他分享 >删除单向链表中数据最小的结点

删除单向链表中数据最小的结点

时间:2024-05-09 16:22:33浏览次数:25  
标签:结点 CurrentNode 单向 链表 最小值 节点 MinNode

(1)算法的基本设计思想

要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:

  1. 定义4个指针,分别命名为MinNodeprevMinNodeCurrentNodePrevCurrentNodeMinNodeprevCurrentNodePrev指向链表的头结点,MinNodeCurrentNode指向链表的首结点。
  2. 同时移动CurrentNodePrevCurrentNode指针,直到CurrentNodePrev指针到达链表的末尾(即CurrentNodePrev->next指针指向NULL),在移动的同时,判断MinNode->data是否大于CurrentNode->data,条件成立则记录当前结点和直接前驱结点。
  3. 此时,MinNode就是最小值结点。

这个算法的关键在于使用了4指针,这个算法的时间复杂度是O(n),其中n是链表的长度。因为我们只需要遍历一次链表就可以找到最小值结点。

(2)C语言实现代码

/****************************************************************************
 * 
 * function name     : LList_FindReciprocalK
 * function          : 设计一个算法删除单链表L(有头结点)中的一个最小值结点。
 * parameter         : 
 *                      @Head: 链表的头指针。
 * 
 * return value      : 失败返回false,成功返回true。
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-22
 * version           : V1.0
 * revision history  : None
 * 
****************************************************************************/
bool LList_MinDel(LList_t *Head)
{
	//1.判断链表是否为空,如果为空,退出
	if (NULL == Head->next)
	{
		printf("LList_MinDel fail, linkedlist is Empty\n");
		return false;
	}

	//2.开始寻找最小值 
	LList_t *MinNodeprev =  Head;   //定义一个变量保存最小值的节点地址的直接前驱
	LList_t *MinNode = Head->next;   //定义一个变量保存最小值的节点地址,初始化为首节点
	
	LList_t *CurrentNodePrev = Head;     //定义一个变量保存当前节点的直接前驱
	LList_t *CurrentNode = Head->next;   //定义一个变量保存当前节点,初始化为首节点

	//开始遍历循环
    while (CurrentNode)  //非零即真,NULL时退出循环,即所有节点数据遍历后退出
    {

		if (MinNode->data > CurrentNode->data)  // 最小值节点data大于当前节点data,成立则进入循环体,链表只有一个首节点也能删除。
		{
			MinNodeprev = CurrentNodePrev; //记录当前最小值节点的前驱节点
			MinNode = CurrentNode;         //记录当前最小值节点
		}
		//不管if条件是否成立,都需要做节点偏移,这样才能遍历节点的所有数据
		CurrentNodePrev = CurrentNode;
		CurrentNode = CurrentNode->next;

    }

	//3.while循环后,已经找到最小值节点,连接后删除原有节点即可。
	printf("MinNode had delete, the value is [%d]\n", MinNode->data);
	MinNodeprev->next = MinNode->next;  //将最小值节点的直接前驱 连接 最小值节点的直接后继
	MinNode->next = NULL;            //将最小值节点的指针域指向NULL
	free(MinNode);                   //释放最小值节点

    return true;

}

验证

crazy3min_图片

标签:结点,CurrentNode,单向,链表,最小值,节点,MinNode
From: https://www.cnblogs.com/crazy3min/p/18182553

相关文章

  • 23. 合并 K 个升序链表
    23.合并K个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150 思路K个升序链表,依据显然的规则:当前最小的值,肯定出自于K个升序链表的K个表头中,对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就......
  • 关于单向不循环链表的创建、插入、删除、遍历、检索
    关于单向不循环链表的创建、插入、删除、遍历、检索单向不循环链表公式初始化单向不循环链表构建单向不循环链表结构体//创建结构体类型typedefstructone_way_node{//数据域chardata[DATA_LEN];//指针域structone_way_node*next;}ONE_WAY_NOD......
  • Leetcode --- 203. 移除链表元素
    题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1: 示例输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]输入:head=[7,7,7,7],val=7输出:[]参考实现方式1、使用递归实现......
  • 自定义单链表(非循环)的基本接口函数
    文件描述及头文件包含/********************************************************************* 文件名称: 单链表(非循环)的基本接口程序* 文件作者:[email protected]* 创建日期:2024/05/07* 文件功能:对单链表的增删改查功能的定义* 注意事项:No......
  • 自定义单链表(非循环)反转的基本函数接口
    题干structListNode*ReverseList(structListNode*head){if(head==NULL||head->next==NULL){returnhead;}else{structListNode*Phead=head;structListNode*temp=head->next;Phead->next=NULL;......
  • 双向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 双向链表实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 单向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 单链表逆序
    逆序原理:保留头节点下一个结点地址,将头节点断开,遍历除头节点以外的节点,将那些节点头插入头节点中。就能实习逆序。/********************************************************************* filename: demo2.c* author :lzj* date :2024/04/23* function:单向链......
  • 头插法新建链表
    新建链表指针结构体typedefintElemType;typedefstructLNode{ ElemTypedata; structLNode*next;//指向下一个结点}LNode,*LinkList;//结构体名LNode==*LinkList;LNode*==LinkList头插法新建链表先建立一个头结点:L=(LinkList)malloc(sizeof(LNode));//带......