linux kernel 自由博客kernelchina.blog.chinaunix.net
bob_zhang2004
在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。
全部博文(197)
开心故事(1)
ia64 开发(1)
linux kernel 研(16)
linux kernel读码(23)
linux driver(5)
kernel新手培训(15)
一些研究(9)
进程间通信(6)
Apache(2)
MySQL(3)
2011年(2)
2010年(6)
2009年(18)
2008年(30)
2007年(100)
2006年(41)
send_lin
hongjiuj
any_wind
tekkaman
浪花小雨
Pierkaso
yunxulan
塑料袋
11937341
ycjttttt
buptdrea
frlhao
hbzjf
分类: 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) .
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->aint 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;}
上一篇:天天上下班的时候复习数据结构,挺有意思 , 车坐的也快
下一篇:开始做 suspend-to-RAM/disk
登录 注册