单向循环链表就地逆置
2012-10-13 15:47
239 查看
原来自己想过一个思路,后来发现完全是不正确的。
看来最后还是得在网上查找算法,最后才实现了。
(1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
(2)当链表含2个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中。这样就可以得到逆置的链表
具体实现起来就不是那么困难了,在纸上面画画就出来了~~~
看来最后还是得在网上查找算法,最后才实现了。
(1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
(2)当链表含2个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中。这样就可以得到逆置的链表
具体实现起来就不是那么困难了,在纸上面画画就出来了~~~
#include <iostream> #include <malloc.h> #define OK 1 #define ERROR 0 #define LENGTH 10 typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; struct LNode* next; }LNode, *LinkList; //创建链表 Status CreateList(LinkList &L) { LinkList s = NULL; int i = 0; L = (LinkList)malloc(sizeof(LNode) * LENGTH); L->next = NULL; L->data = 0; for (i = 1; i <= LENGTH; i++) { s = (LinkList)malloc(sizeof(LNode)); s->data = 10 - i + 1; s->next = L->next; L->next = s; } return OK; } //链表逆置 Status InverseList(LinkList &L) { LinkList p = NULL; LinkList q = NULL; //传入的L是头节点 if (L && L->next )//保证至少含有两个节点以上 { //创建两个临时变量 p = L->next; q = p->next; p->next = NULL; } //将除了头节点和第一个节点之外的多余节点遍历并将每个节点摘出来放到头节点的后面 while (q) { p = q; q = q->next; p->next = L->next; L->next = p; } return OK; } //打印链表 Status PrintfList(LinkList L) { int i = 0; if (L == NULL) std::cout<<"该链表是空表"<<std::endl; while(L->next != NULL) { std::cout<<"第"<<i<<"个节点的数值:"<<L->data<<std::endl; L = L->next; i++; } std::cout<<"第"<<i<<"个节点的数值:"<<L->data<<std::endl; std::cout<<std::endl; return OK; } //删除链表 Status DeleteList(LinkList &L) { LinkList p = NULL; while (L->next) { p = L->next; L->next = p->next; free(p); } return OK; } int main() { LinkList L = NULL; //创建链表,长度为10个长度 CreateList(L); //打印链表 PrintfList(L); //链表逆置 InverseList(L); //重新打印链表 PrintfList(L); //删除链表 DeleteList(L); //删除链表之后打印链表 PrintfList(L); return 0; }
相关文章推荐
- 数据结构-【链表】单向链表的逆置和双向循环链表
- 单向不循环链表就地转置算法
- 实现单向循环链表的创建、测长、打印、插入、删除及逆置
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 链表的基本操作 (1)采用尾插法建立一个链表; (2)输入一个元素,在道表中查找该元素是否存在,请给出相关信息; (3)将链表中的元素进行就地逆置。
- 大话数据结构(三)——单向循环链表的java实现
- 单向循环链表实现约瑟环问题
- JavaScript数据结构之单向循环链表应用-约瑟夫问题
- 链表 3之单向循环链表
- 一步一步写算法(之循环单向链表)
- 链表就地逆置和合并
- 数据结构-单向有头不循环链表基本实例
- c语言数据结构之单向循环链表约瑟夫问题
- 用单向循环链表实现约瑟夫环
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 数据结构作业代码保存-2.1 单向循环链表的建立,插入和删除,和指针移动
- 一步一步写算法(之循环单向链表)
- 单向循环链表的表示和实现
- 初学数据结构——单向循环链表和双向循环链表。