http://blog.youkuaiyun.com/kangroger/article/details/20237081
单链表反转有递归和非递归两种算法。
节点
- typedef struct ListNode{
- int value;
- ListNode* next;
- }ListNode;
递归算法
- void Inversion_Recursion(ListNode* p,ListNode* Head)
- {
- if(p->next==NULL)
- {
- Head->next=p;
- return;//找到最后一个节点
- }
- Inversion_Recursion(p->next,Head);
- p->next->next=p;//反转节点
- p->next=NULL;//第一个节点反转后其后继应该为NULL
- }
非递归
- void Inversion(ListNode* Head)
- {
- ListNode *current,*tmp;
- current=Head->next;
- if(current!=NULL)//反转后第一个节点的后继要为NULL
- {
- tmp=current;
- current=current->next;
- tmp->next=NULL;
- }
- while(current!=NULL)
- {
- tmp=current;
- current=current->next;
- tmp->next=Head->next;
- Head->next=tmp;
- }
- }
测试代码:
- #include<iostream>
- #include<malloc.h>
- typedef struct ListNode{
- int value;
- ListNode* next;
- }ListNode;
- int main()
- {
- ListNode* Head=(ListNode*)malloc(sizeof(ListNode));
- if(Head==NULL)
- std::cout<<"malloc failed"<<std::endl;
- ListNode* tmp=Head;
- for(int i=1;i<=10;i++)
- {
- tmp->next=(ListNode*)malloc(sizeof(ListNode));
- tmp->next->value=i;
- tmp->next->next=NULL;
- tmp=tmp->next;
- }
- Inversion_Recursion(Head->next,Head);
- Inversion(Head);
- tmp=Head->next;
- while(1){
- std::cout<<tmp->value<<std::endl;
- if(tmp->next==NULL)
- break;
- tmp=tmp->next;
- }
- }