用头插法反转链表
来源:互联网 发布:左林右莉走一回 知乎 编辑:程序博客网 时间:2024/05/21 16:30
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。
链表结点定义如下:
typedef char item_t;
typedef struct node {
item_t item;
struct node * next;
} node_t;
分析: 使用头插法可以快速实现反转。所谓头插法, 即每次将新节点插入到链表的头节点之前。
实现代码如下:
#include <stdio.h>#include <stdlib.h>typedef char item_t;typedef struct node { item_t item; struct node * next;} node_t;node_t * createList(int len);void destroyList(node_t *head);void displayList(node_t *head);node_t * reverseList(node_t *head);int main(int argc, char *argv[], char *env[]){ int i; int len = 80; node_t *head = NULL; //测试函数 for(i=0; i<=len; i++) { head = createList(i); displayList(head); head = reverseList(head); displayList(head); if(head) { destroyList(head); head = NULL; } printf("\n"); } return 0;}//用头插法创建单链表node_t * createList(int len) { node_t * head = NULL; node_t *p; if(len == 0) return NULL; int i = 0; do{ p = (node_t *) malloc(sizeof(node_t)); if(p) { p->item = '0' + i; p->next = head; head = p; } } while(++i<len); return head;}//销毁单链表void destroyList(node_t *head) { node_t *p; while(head) { p = head; head = p->next; free(p); }}//显示单链表void displayList(node_t *head) { node_t *p = head; while(p) { printf("%c ", p->item); p = p->next; } printf("\n");}//用头插法将单链表逆转node_t * reverseList(node_t *head) { node_t *p; node_t *q; p = head; head = NULL; //head指向逆转后的链表的首节点,初始为空。 while(p) { q = p->next; //q指向剩余链表的首个节点 //用头插法将节点插入到新的逆转链表 p->next = head; head = p; p = q; //p指向原链表的剩余节点的首节点 } return head;}
用Linux下的内存泄露检查工具valgrind的memcheck检查的结果如下:
- 用头插法反转链表
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- DAS, NAS, and SAN
- QCRIL层qcril.c部分解析
- OnInitialUpdate 被调用两次问题
- 把C++类成员方法直接作为线程回调函数
- Https Jsse java Ssl 研究2
- 用头插法反转链表
- 【GSL】GNU Scientific Library 科学计算库VS2010安装配置
- 也许是经典的sql语句
- User breakpoint called from code at
- Android按键监听与模拟分析
- 免费的Android UI库及组件推荐
- XStream使用之一
- org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
- javascript 学习一