您的位置:首页 > 职场人生

面试题:单链表逆置(分别用非递归和递归两种方法实现)

2013-04-13 21:04 666 查看
#include <iostream>

using namespace std;

typedef struct LNode

{
int data;
struct LNode* next;

}LNode;

LNode* creatLinkList()

{
LNode* head,*p,*s;
int numNode,nodeData;
int count = 1;

head = new LNode;
p = head;
p->next = NULL;
cout<<"The number of the linklist's nodes? ";
cin>>numNode;

while(numNode != 0)
{
s = new LNode;
p->next = s;
//別犯s = p->next;的低级错误,因为这会将新创建的结点的地址从s中抹去

cout<<"The data of NO. "<<count ++<<" 's node: ";
cin>>nodeData;
s->data = nodeData;

p = p->next;
p->next = NULL;
numNode --;
}
return head;

}

void printLinklist(LNode* l)

{
if (l->next == NULL)
{
cout<<"The linklist is empty!"<<endl;
return;
}

LNode* p = l ->next;
while( p!= NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;

}

//普通方法1

//LNode* reverse(LNode* l)

//{

// LNode*p,*s,*t,*first;

// p = first = l->next;

//

// if (p->next == NULL)//单链表只有1个元素直接返回这个单链表

// return l;

// else

// {

// s = p->next;

// t = s->next;

//

// while(t != NULL)

// {

// s->next = p;

//

// p = s;

// s = t;

// t = s->next;

// }

// s->next = p;//把单链表的最后一个元素和前面已经反转的元素连起来

// l->next = s;//把头结点和单链表的最后一个元素连起来

// first->next = NULL;//把单链表的第一个元素的下一个指针置空

// return l;

// }

//}

//普通方法1

//LNode* reverse(LNode* l)

//{

// LNode* p,*s,*t;

//

// if (l->next == NULL)

// return l;

//

// p = l->next;

// s = p->next;

// while(s != NULL)

// {

// t = s->next;

// s->next = p;

// p = s;

// s = t; 

// }

// l->next->next = NULL;

// l->next = p;

// return l;

//}

//递归方法,此函数适合处理无头节点的单链表

LNode* reverse(LNode* l)

{
LNode* p;

if (l == NULL || l->next == NULL)
return l;

p = reverse(l->next);
l->next->next = l;//单链表的倒数第二个结点
l->next = NULL;
return p;
//链表的最后一个结点

}

int main()

{
LNode* l;
l = creatLinkList();
printLinklist(l);

//reverse(l);
l->next = reverse(l->next);

printLinklist(l);
return 0;

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