典型的几个链表操作-逆序和重排

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值