链表反转(使用递归和非递归两种方式)
2015-10-22 12:21
519 查看
#include <stdio.h> #include <iostream> using namespace std; //链表的数据结构 typedef struct lNode { int data; struct lNode *next; }linkList; //判断链表是否为空的方法 bool isEmpty(linkList *&L){ return (L->next == NULL); } //初始化链表 linkList* initLinklist(linkList *&head,int data){ head = (linkList *)malloc(sizeof(head)); head->data = data; head->next = NULL; cout<<"初始化链表成功"<<endl; return head; } //给链表尾部添加结点 void tailNodePlus(linkList *&head,int data){ linkList* newNode = new linkList; if(isEmpty(head)){ head->next = newNode; newNode->data = data; //cout<<newNode->next<<endl; newNode -> next = NULL; cout<<"链表结点插入成功"<<endl; }else{ linkList* tempNode = head; //找到尾结点 while(tempNode->next != NULL){ tempNode = tempNode->next; } tempNode->next = newNode; newNode->data = data; newNode->next = NULL; //链表结点插入成功 cout<<"链表结点插入成功"<<endl; } } //将链表中的内容输出 void printLinkList(linkList *L){ if(L == NULL){ return; } while(L->next != NULL){ cout<<L->data<<'\t'; L = L->next; } cout<<L->data;//输出最后一个链表结点的值 } //将生成的链表反转(递归的方法,不考虑使用额外的存储空间) linkList* reverseLinkList(linkList *head){ if(head == NULL || head->next == NULL){ return head; }else{ linkList* newHead = reverseLinkList(head->next);//先反转链表后面的元素 head->next->next = head; head->next = NULL; return newHead; } } //将生成的链表反转(用非递归的方法,需要额外的的结点存储空间) linkList* reverseLinkList2(linkList *head){ linkList *currentNode = head;//缓存第一个结点 linkList *nextNode = head->next;//缓存第二个结点 head->next = NULL;//将尾结点作为特殊情况在循环外面做特殊对待 while(nextNode != NULL){ currentNode = nextNode;//此时的currentNode应该向前推进一个 nextNode = nextNode->next;//nextNode也应该向前推进一个 currentNode->next = head;//修改指针的指向 head = currentNode;//让head结点始终为链表反序后的头结点 } return head; } /*测试一下*& void test(linkList *&head){ cout<<head<<endl; linkList* node = head; cout<<node<<endl; }*/ int main(int argc, char *argv[]) { linkList *head = new linkList; head = initLinklist(head,1); tailNodePlus(head,2); tailNodePlus(head,3); tailNodePlus(head,4); /*linkList* reverseHead = reverseLinkList2(head);//非递归的方法获取新的头结点 printLinkList(reverseHead);//反转的目的已经达到,输出4 3 2 1*/ linkList* reverseHead2 = reverseLinkList(head);//递归的方式获取新的头结点 printLinkList(reverseHead2);//反转的目的已经达到,输出4 3 2 1 return 0; }
相关文章推荐
- 即时聊天IM之一 XMPP协议简述
- Ubuntu vim配置.vimrc文件及用vundle安装插件
- mergesort
- 有向无环图的拓扑排序
- 双网卡绑定后bond是eth3的网卡信息
- 第一个Linux下的批处理文件
- 行内元素和块级元素
- 新浪微博学习的知识点
- 第8周项目3-顺序串算法
- oracle hanganalyze工具的使用
- 几种排序算法的总结(java版)
- Hibernate 一对多 保存和修改数据
- Eclipse中R文件不能自动生成
- hdu 4764 Stone
- 一个很漂亮的美食下拉刷新:BeautifulRefreshLayout
- 图像公司
- TFS的使用
- 1022 词法分析程序
- Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法
- awakeFromNib和 viewDidLoad的使用时机