您的位置:首页 > 其它

单向链表的创建及翻转

2011-04-08 19:45 302 查看
感谢XX公司的笔试啊,让我总算下定决心彻底把这个似乎很简单的问题想一想了,发觉之前自己的理解真是差强人意!

下面的链表翻转是通过重新创建一个新链表来实现的,空间复杂度过于不理想...

#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
}*head;
void AddNode(int value);
void Swap(Node *&head);
int main()
{
head=NULL;
AddNode(1);
AddNode(2);
AddNode(3);
AddNode(4);
AddNode(5);
AddNode(6);
Node *p=head;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
Swap(head);
p=head;
cout<<endl;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
system("pause");
return 0;
}
void AddNode(int value)
{
Node *p=new Node();
p->data=value;
p->next=NULL;

if(!head)
{
head=p;
}
else
{
Node *q=head;
while(q->next)
q=q->next;
q->next=p;
}
}
void Swap(Node *&head)
{
Node *qOld=head;
Node *pHead=new Node();
if(!head)
{
cout<<"链表为空!"<<endl;
return ;
}
pHead->data=head->data;

pHead->next=NULL;
while(qOld->next)
{
Node *pNew=new Node();
*pNew = *(qOld->next);
pNew->next=pHead;
pHead=pNew;
qOld=qOld->next;
}
head=pHead;
}


改进:使用传说中的三指针法~

void Swap(Node *&head)
{
if(!head)
{
cout<<"链表为空!"<<endl;
return ;
}
Node *a[3];
a[0]=a[1]=NULL;
a[2]=head;
while(a[2]->next)
{
a[0]=a[1];
a[1]=a[2];
a[2]=a[2]->next;
a[1]->next=a[0];

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