单向链表逆序
2015-06-02 16:08
309 查看
本博文原创链接:http://blog.csdn.net/niuer09/article/details/5961004
设链表节点为
要求将一带链表头List head的单向链表逆序。
分析:
1). 若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
示例:以逆序A->B->C->D为例,图示如下
实现及测试代码如下:
设链表节点为
typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List;
要求将一带链表头List head的单向链表逆序。
分析:
1). 若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
示例:以逆序A->B->C->D为例,图示如下
实现及测试代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List; void PrintList(List head); List ReverseList(List head); int main() { //分配链表头结点 ListNode *head; head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; head->data = -1; //将[1,10]加入链表 int i; ListNode *p, *q; p = head; for(int i = 1; i <= 10; i++) { q = (ListNode *)malloc(sizeof(ListNode)); q->data = i; q->next = NULL; p->next = q; p = q; } PrintList(head); /*输出原始链表*/ head = ReverseList(head); /*逆序链表*/ PrintList(head); /*输出逆序后的链表*/ return 0; } List ReverseList(List head) { if(head->next == NULL || head->next->next == NULL) { return head; /*链表为空或只有一个元素则直接返回*/ } ListNode *t = NULL, *p = head->next, *q = head->next->next; while(q != NULL) { t = q->next; q->next = p; p = q; q = t; } /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/ head->next->next = NULL; /*设置链表尾*/ head->next = p; /*调整链表头*/ return head; } void PrintList(List head) { ListNode* p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("/n"); }
相关文章推荐
- 安卓应用商店遭遇的创新窘境
- 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
- (转)JS window对象的top、parent、opener含义
- leetcode第136题-Single Number
- Python中的自省(反射)详解
- Cron表达式详解
- 标称属性的邻近性度量
- Web API 版本化的介绍
- C# 替换Word文字【包含页眉、页脚、文本框、普通文字的替换】
- 我了解的百度排名算法因素
- JavaScript获取当前根目录
- VelocityTracker简介
- 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)
- 第六十四条:努力使失败保持原子性
- 系统集成项目管理工程师2009年上半年(上午题)
- Add Two Numbers
- STC单片机红外遥控器读码、发射程序
- DevExpress GridView 两个问题
- Hibernate学习资源汇总
- 备忘,git常用操作