- 博客(6)
- 收藏
- 关注
原创 内核链表的用法
一、内核链表的基本思想linux内核链表是使用C语言实现的通用链表,为双向循环链表,可以方便的移植使用。它的基本思想是将数据域和指针域分开,内核链表实现的一系列增、删、改、查操作就是针对指针域的,而数据域则由内核链表的使用者根据实际需求自行完成。这样一来,内核链表便可以实现通用,而应用程序则可以不用关心链表底层操作的实现,感觉上有点类似C++继承机制。二、内核链表源码可从linux内核源码中提取,只需要拷贝list.h一个文件即可,网上也有不少版本,不过整体的思想是一致的。三、部分关键源码1、指针
2021-02-16 22:50:27
838
原创 判断链表中是否有环
一、简述 判断一个链表中是否存在环,使用快慢指针,时间复杂度O(n),空间复杂度O(1)。二、代码实现 bool hasCycle(ListNode *head) { if(NULL == head){ return false; } ListNode *pFirst = head; ListNode *pSecond = head; while((NULL != pFirst->next)
2020-11-17 22:46:14
130
原创 单链表反转
一、简述 完成对单向链表的反转。固定维护两个指针,时间复杂度为O(n),空间复杂度为O(1)。二、代码实现ListNode* ReverseList(ListNode* pHead) { if((NULL == pHead) || (NULL == pHead->next)){ return pHead; } ListNode *prev = pHead; ListNode *pnext = pHead-&
2020-11-17 22:39:33
120
原创 寻找数组中的第K大元素
一、简述 使用数据结构堆,实现查找数组中的第K大元素。流程如下:数组内容堆化(因为是查找第K大,所以使用大根堆)、依次取出并删除堆的根节点、将剩余元素堆化、取到第K个即为目标元素。二、代码实现#include <iostream>#include <vector>using namespace std;int findKth(vector<int> a, int n, int K) { int heapSize = n;
2020-11-17 22:32:56
421
原创 Linux下时间相关接口封装
一、相关系统调用1、time函数函数原型:time_t time(time_t *time)头文件:#include <time.h>功能:获得系统当前时间返回值(长整型):成功返回从公元1970-1-1,00:00:00到当前的秒数,失败返回-1参数(传出参数):同返回值2、gmtime函数函数原型:struct tm *gmtime(const time_t *time)头文件:#include <time.h>功能:将从公元1970-1-1,00:00:00
2020-09-29 22:04:32
285
原创 线程池原理及C语言实现
一、简介1、线程池的概念线程池本质就是线程的集合。 进程在启动时便创建一定数量的线程,在没有任务时,这些线程处于空闲状态。程序在运行时可将任务通过任务队列传递给线程池,这是池中的线程便会启动一个来执行该任务,任务执行完后,启动的线程不会被销毁,而是重新返回空闲状态,等待下一个任务的执行。2、线程池的优势在多线程运行的程序中,如果不断地创建和销毁线程,会过度消耗系统资源,内核开销较大。并且过度切换线程会带来一定的危险,从而增加系统崩溃的可能性。线程池会维护相对稳定的线程数,减少了频繁创建、销毁线程带
2020-09-13 17:15:13
694
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人