链表逆序
来源:互联网 发布:东华软件数据库 编辑:程序博客网 时间:2024/06/01 10:09
原文地址:http://blog.csdn.net/niuer09/article/details/5961004
设链表节点为:
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");}
- 链表的逆序
- 链表逆序
- 链表逆序
- 链表逆序小结
- 逆序链表
- 链表逆序 :华硕
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 实现链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- android文件浏览器
- 重复的数字
- 用css控制图片大小 让你不要再为图片变形烦恼
- poj 3167 Cow Patterns ... 四种算法 (均结合kmp)
- C++STL标准入门汇总
- 链表逆序
- 探索推荐引擎内部的秘密,第 1 部分: 推荐引擎初探
- 0002
- 迷茫
- static in C
- TCP/IP数据包解析示例
- 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
- 0003
- linux下gcc基本使用