http://dev.firnow.com/course/3_program/c++/cppjs/20081012/150161.html
已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)
已知两个链表head1 和head2 各自有序升序排列,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
已知两个链表head1 和head2 各自升序排列,请把它们合并成一个链表依然有序,这次要求用递归方法进行。 (Autodesk)
递归版本实际上很容易从上面一个版本改动而得来,主要是注意退出的条件和跌代的条件。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mumu10/archive/2008/09/05/2886817.aspx
下面有code的地方都经过了验证的 :)
list 的定义
typedef struct{
int val;
struct list *next;
} list;
1. 反转一个链表,循环算法。
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;
}
2. 反转一个链表,递归算法。
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;
}
}
3. 判断一个链表是否有循环。
思路有些意思,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;
}