Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1634730
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2008-11-13 22:31:10

就地置换链表,很简单。

typedef struct node_t {
    void *data_p; //可以兼容所有的数据类型

    struct node_t *next;
}node_t;
typedef struct list_t {
    node_t *header;
    // int size; //元素个数
}list_t;
//这里就要就地置换链表

int convert_there(list_t *list)
{
    //header->a->b->c
    //header->c->b->a
    node_t * p = list->header->next;
    node_t *q = NULL;
    list->header->next = NULL;
    
    while(p)
    {
        q = p;
        p = p->next;  //注意这里, 已经要放在这里,千万不能放在最后一行,否则就不循环了 , 我们一定要保存在下一个节点, 才可以操纵当前的这个节点
        q->next = list->header->next;
        list->header->next = q;
    }
    
    return 0;
}
    

时间复杂度O(n) .

 

 

相比下面这个实现, 上面非常简单高效:

 

//倒置list , 比如 header -> a -> b -> c 执行convert函数后 变成 header->c->b->a
int convert(list_t *list)
{
    node_t *tmp = NULL;
    DECLARE_LIST(tmp_list);
    
    tmp = list->header->next;
    if(!tmp) {
        printf("list empty \n");
        return -1;
    }
    //遍历链表
    while(tmp)
    {
        node_t *next_node = tmp->next; //因为tmp在下行操作后 tmp->next 就等于NULL了,所以这里要记住tmp->next
        list_add(tmp,tmp_list);
        tmp = next_node;
    }
    free(list->header); //释放之前的header
    list->header = tmp_list->header; //原来的链表的header更新一下,是现在新的头
    return 0;
}

阅读(2599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~