下面有code的地方都经过了验证的 :)
list 的定义
1. 反转一个链表,循环算法。
2. 反转一个链表,递归算法。
3. 判断一个链表是否有循环。
思路有些意思,code比较简单,就不列code了。
方法1:快慢法,一个以步长为1遍历,一个以步长为2遍历,next为空前相遇即为循环链表。
方法2:破环结构法,遍历链表,修改链表项的某些结构,通常修改next指针,如果遍历完之前,发现有链表项已经修改,则为循环链表。
当然还有更愚蠢的方法3,就不献丑了 :)
4. 两个链表,一升一降,合并为一个升序链表。
没有什么技巧,不写code了。
5. 在双向链表中删除指定元素。
同上 :)
PS. 一些数组相关的也放在这里吧。
1. 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素。
定义了个字符串数组,方便返回结果:
函数:
list 的定义
- typedef struct{
- int val;
- struct list *next;
- } list;
- list * reserve_list_by_recurrence(list *l)
- {
- list * l_item = l;
- list * n_item = l->next;
- while (n_item != 0)
- {
- list * p_item = l_item;
- l_item = n_item;
- n_item = l_item->next;
- l_item->next = p_item;
- }
- l->next = 0;
- return l_item;
- }
- list * reserve_list_by_recursion(list* p_l, list *l, list *n_l)
- {
- l->next = p_l;
- if (n_l != 0)
- {
- reserve_list_by_recursion(l, n_l, n_l->next);
- }
- else
- {
- return l;
- }
- }
思路有些意思,code比较简单,就不列code了。
方法1:快慢法,一个以步长为1遍历,一个以步长为2遍历,next为空前相遇即为循环链表。
方法2:破环结构法,遍历链表,修改链表项的某些结构,通常修改next指针,如果遍历完之前,发现有链表项已经修改,则为循环链表。
当然还有更愚蠢的方法3,就不献丑了 :)
4. 两个链表,一升一降,合并为一个升序链表。
没有什么技巧,不写code了。
5. 在双向链表中删除指定元素。
同上 :)
PS. 一些数组相关的也放在这里吧。
1. 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素。
定义了个字符串数组,方便返回结果:
- char *check_array_repeat_str[3] = {"no repeat","repeat", "error"};
- printf ("%s", check_array_repeat_str[check_array_repeat(a, 10)]);
- int check_array_repeat(int a[], int n)
- {
- int i;
- int *flag_array = malloc(sizeof(int) * (n+1));
- memset(flag_array, 0, sizeof(int) * (n+1));
- for(i=0; i<=n; i++)
- {
- if ((a[i]>n) || (a[i]<0))
- {
- return 2; //error
- }
- if (*(flag_array+a[i]) == 1)
- {
- return 1; //repeat
- }
- else
- {
- *(flag_array+a[i]) = 1;
- }
- }
- return 0;
- }
本文介绍了链表的基本操作,包括使用循环和递归方法反转链表,判断链表是否包含循环,以及合并两个不同顺序的链表。此外,还提供了一个检查数组是否存在重复元素的有效算法。


被折叠的 条评论
为什么被折叠?



