数据结构学习之对单向链表进行快速高效的排序(排序链表)

  • 实例要求:
  • 1、给定一个链表的头结点 head ,请将其按升序排列并返回排序后的链表
  • 2、链表中节点的数目的范围为 [0, 5 * 104]
  • 实例分析:
  • 1、引入qsort函数和自定义cmp函数解决问题;
  • 2、借助自定义指针作为中间量,将链表节点的值依次赋值;
  • 3、排序结束后,再将指针保存的链表节点归位即可;
  • 4、为防止内存泄漏,需要使用free函数释放指针所占用的空间;
  • qsort函数:
	void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
	/*
	参数:
		base //指向要排序的数组的第一个元素的指针
		nitems //由 base 指向的数组中元素的个数
		size //数组中每个元素的大小,以字节为单位
		compar //用来比较两个元素的函数
		
	*/
  • 自定义cmp函数:
	//对int数组升序排序
	int cmp(const void *a ,const void *b)
	{
		return *(int *)a-*(int *)b;
	}

  • 相关案例:
    数据结构学习之对单向链表进行快速高效的排序(排序链表)_第1张图片

  • 示例代码:

	/**
	 * Definition for singly-linked list.
	 * struct ListNode {
	 *     int val;
	 *     struct ListNode *next;
	 * };
	 */
	
	int cmp(const void* a, const void* b){
	    return *(int*)a - *(int*)b;
	}
	
	struct ListNode* sortList(struct ListNode* head) 
	{
	
	    if(head == NULL || head->next == NULL)
	    {
	        return head;
	    }
	
	    struct ListNode *temp = head;
	    int len = 0;
	    while(temp != NULL)
	    {
	        ++len;
	        temp = temp->next;
	        
	    }
	
	
	    int *num = (int *)malloc(sizeof(int) * len);
	    
	    int i = 0;
	    temp = head;
	    while(temp != NULL)
	    {
	        num[i++] = temp->val;
	        temp = temp->next;
	    }
	
	    qsort(num,len,4,cmp);
	
	    i = 0;
	    temp = head;
	    while(temp != NULL)
	    {
	        temp->val = num[i++];
	        temp = temp->next;
	    }
	
		free(num);
		num = NULL;
	    return head;
	    
	}
  • 运行结果:
    数据结构学习之对单向链表进行快速高效的排序(排序链表)_第2张图片

数据结构学习之对单向链表进行快速高效的排序(排序链表)_第3张图片

你可能感兴趣的:(C语言学习系列,笔试题,数据结构,学习,链表)