链表反转的递归和非递归算法
注:链表没有伪头部,第一个元素是数据元素
节点定义如下:
struct node
{
int data;
node *next;
};
非递归算法:
1 node * Reverse(node*head)
2 {
3 if(head==NULL)return NULL;
4 node*pre=head;
5 node*p=pre->next;
6 node *q=NULL;
7 while(p!=NULL)
8 {
9 q=p->next;
10 p->next=pre;
11 if(pre==head)//反转后防止出现环
12 pre->next=NULL;
13 pre=p;
14 p=q;
15 }
16 return pre;
17 }
递归算法:
node * Reverse(node *List,node*pre=NULL){ if(List==NULL) return List; node *next = List->next; List->next=pre; return next==NULL?List:Reverse(next,List); }