链表逆序
2014-03-12 21:51
141 查看
要求将一带链表头List head的单向链表逆序。
分析:
1). 若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
示例:以逆序A->B->C->D为例,图示如下
实现代码:
分析:
1). 若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
示例:以逆序A->B->C->D为例,图示如下
实现代码:
//head.h #include <iostream> typedef struct ListNode{ int data; struct ListNode* next; }ListNode, *List; void PrintList(List head); List ReverseList(List head); //Creat.cpp #include "head.h" 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; //让第二个元素的next指针指向第一个元素(逆序的关键) 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) { std::cout<<p->data<<" "; p = p->next; } std::cout<<std::endl; } //ConvertList.cpp #include "head.h" 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; }
相关文章推荐
- 递归逆序输出链表
- 删除不带头结点的单链表的非尾结点&&逆序打印单链表
- 【数据结构】单链表逆序(转)
- 单链表逆序
- 将一个链表逆序并输出
- 有一个带头结点的单链表L={a1,b1,a2,b2,...,an,bn},设计一个算法将其拆分成两个带头结点的单链表A和B,正序链表A={a1,a2,a3...,an},逆序链表B={bn,bn-1,
- 链表的建立、输出、逆序
- 链表的逆序
- 单链表逆序
- 将一个单向链表逆序
- 单链表逆序
- 数据结构实验之链表二:逆序建立链表
- 双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
- 链表相关算法小结(判断环、复制、逆序等)
- java 链表逆序
- 记一道关于链表逆序的面试题
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- 华为机试—逆序链表输出
- 一种简单的单链表逆序、反转的方法
- ms的将链表逆序的笔试题