带头结点的单链表的逆置

 

代码
//带头结点的单链表逆置.cpp

#include
<iostream>
using namespace std;


struct Node{
int data;
Node
* next;
};

void print(Node* list) //遍历带头结点的单链表
{
Node
* t=list->next;
while(t!=NULL){
cout
<<t->data<<", ";
t
=t->next;
}
}

void create(Node* &l,int data[],int n) //创建带头结点的单链表l=(data[0],data[1],...,data[n-1])
{
l
=new Node;
l
->next=NULL;

Node
* tail=l;
Node
*t;
for(int k=1;k<=n;k++){
t
=new Node;
t
->data=data[k-1];
t
->next=NULL;

tail
->next=t;
tail
=t;
}
}

/*逆置算法1

void ReverseLinkList2 (Node* &L ) {
// L是带头结点的单链表的头指针;p、q、r是三个辅助指针
//在扫描链表的过程中进行逆置操作
Node* p,*q,*r;
if (!L->next ) return; //空表
p=L->next; q=p->next; //原表中,*p为*q的前驱
p->next=NULL; //a1的next置空指针,剥离头结点
while (q) { r=q->next ; //修改q->next之前,保存q->next到r
q->next=p ; //逆置表中,*q为*p的前驱
p=q ; q=r ; //参与扫描的指针都需后移
}
L->next=p;
} //ReverseLinkList2

*/

void ReverseList(Node* &l)
{
Node
*p,*q,*r;

p
=l->next->next;q=p->next;
if(p==NULL) return;//有一个元素时,直接返回

r
=l->next;
r
->next =NULL;

while(p->next!=NULL){ //每次将未逆置的链表中的首结点*p,挂在部分逆置好的链表首结点*r之前,
//在改变p->next之前,将p的后继结点存储在q之中
p->next=r;
r
=p;
p
=q;q=p->next;

}

p
->next=r; //最后一结点的处理
l->next=p;
}

int main()
{
Node
* mylist;
int a[]={1,2,3,4,5,6,7,8,9,10};
int size=sizeof(a)/sizeof(int);
create(mylist,a,size);
print(mylist);

cout
<<endl;

ReverseList(mylist);
print(mylist);
return 0;

}













 

posted @ 2010-09-08 13:05  碧天云月  阅读(668)  评论(0编辑  收藏  举报