您的位置:首页 > 其它

反转一个单链表,分别以迭代和递归的形式来实现

2012-10-04 19:08 579 查看
迭代法:

// 反转单链表.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <stdlib.h>

typedef struct node
{
int data;
struct node *next;
}linknode,*linklist;

linknode *reverse(linknode *head)//带有头结点的单链表迭代反转,非递归方法
//思路:将当前结点的next指向前驱;当前结点指向next
{
if(head==NULL)
return 0;
linknode *pre,*cur,*ne;//pre 前驱结点指针;cru当前结点指针;ne后继指针
pre=head;
cur=head->next;
while(cur!=NULL)
{
ne=cur->next;
cur->next=pre;
pre=cur;
cur=ne;
}
linknode *q;
q=head->next;
q->next=NULL;
head->next=pre;
return head;
}

void printLinkList_H(linklist L) //打印
{
linklist p;
p=L->next;
while(p)
{
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}

void main()
{
int i;
linklist L = (linklist)malloc(sizeof(linknode));
L->next = NULL; //头结点
for(i = 1;i<=5;i++)//新建一个带头结点的单链表
{
linklist p = (linklist)malloc(sizeof(linknode));
p->data = i;
p->next = L->next;
L->next = p;
}
printLinkList_H(L);
reverse(L);
printLinkList_H(L);
}


递归法:

// 反转单链表.cpp  递归法

#include "stdafx.h"
#include <stdlib.h>

typedef struct node
{
int data;
struct node *next;
}linknode,*linklist;

linknode *RecReverseList(linknode *head)
{
if (head==NULL)
return 0;
linknode *curr , *reverse_head , *temp;
if(head->next==NULL)
return head;
else
{
curr=head;
temp=head->next;
reverse_head=RecReverseList(temp);
}
temp->next=curr;
curr->next=NULL;
return reverse_head;
}

void printLinkList_H(linklist L) //打印
{
linklist p;
p=L->next;
while(p)
{
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}

void main()
{
int i;
linklist L = (linklist)malloc(sizeof(linknode));
L->next = NULL; //头结点
for(i = 1;i<=5;i++)//新建一个带头结点的单链表
{
linklist p = (linklist)malloc(sizeof(linknode));
p->data = i;
p->next = L->next;
L->next = p;
}
printLinkList_H(L);
linklist q;
q=RecReverseList(L->next);
while(q)
{
printf("%4d", q->data);
q = q->next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: