您的位置:首页 > 其它

链表反转(使用递归和非递归两种方式)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: