
算法
dliang27
这个作者很懒,什么都没留下…
展开
-
链表排序--选择排序
使用双指针,读指针遍历后面节点,与当前的节点比较,符合条件(比大小)就交换,因此该算法涉及到两个循环void sort_list(node *head){ node *p, *q, *s; int t; p = head; while(p) { s = p; q = p->next; while(q) { if (q->value原创 2015-11-02 12:21:12 · 327 阅读 · 0 评论 -
链表操作--逆序
非递归逆置:void reverse_list(node **head){ node *p, *q, *r; p = *head; q = p->next; while(q!=NULL) { r = q->next; q->next = p; p = q; q = r; } (*head)->next = NULL; *he原创 2015-11-02 12:11:36 · 373 阅读 · 0 评论 -
双指针的妙用(1)--特定字符的提前
实现一个时间复杂度为n的算法,将一个字符串中的所有*提前:he*llo wor*l*d => ***hello world原创 2015-11-02 11:56:10 · 309 阅读 · 0 评论 -
位图法--查找字符串中第一个不重复的字符
使用为位图法,查找字符串中第一个不重复的字符,使用位图法,该字符是数组的index,而出现的次数则是数值char find_first_single_char(const char *str){ int tmp[256]={0}; char *s= (char *)str; while(*s!='\0') { tmp[*s]++; s++;原创 2015-11-02 14:17:36 · 395 阅读 · 0 评论 -
链表排序--快速排序
使用快速排序对链表进行排序:void q_sort(int numbers[], int left, int right){ int pivot, l_hold, r_hold; l_hold = left; r_hold = right; pivot = numbers[left]; while(left < right) { while (原创 2015-11-02 12:24:03 · 327 阅读 · 0 评论 -
位图法之排除相同的数
从一个正整数数组中找出重复的数,假设数组的值都小于65536原创 2015-11-02 12:04:58 · 350 阅读 · 0 评论 -
素数的查找
使用筛法找出4万内的素数因为2,3分别是素数中最小的偶数和奇数,所以只要是2或者3的倍数的都不是素数,剩下的则是素数。#define MAXN 40000int SPrime(void){ int i, j; int b_size; int prime[MAXN], b[MAXN]; for (i = 2 ; i <原创 2015-11-02 15:21:04 · 325 阅读 · 0 评论 -
链表--中间节点
快慢指针找到链表的中间节点node * find_list_middle_node(node * list){ if(list == NULL || list->next == NULL) { return list; } node *p1 = list; node *p2 = list; while(p1&&p2原创 2015-11-02 15:02:37 · 345 阅读 · 0 评论 -
链表--查看链表是否含有环(不一样的方法)
双指针法,一个快指针,一个慢指针,链表若有环的话,快指针必然会与慢指针相遇typedef struct _node{ int data; struct _node *next;}node,*pnode;int FindLoop(node *head){ node *p = NULL; node *q = NULL; if (head == NULL)原创 2015-11-02 14:57:37 · 378 阅读 · 0 评论 -
链表逆置--递归
使用递归的方法将链表逆置:关键是将当前逆置节点之后的子链当做一个已逆置好的链表,看做是一个整体。原创 2015-11-02 12:16:04 · 913 阅读 · 0 评论