您的位置:首页 > 其它

带头结点的单链表的逆置

2010-09-08 13:05 281 查看
代码

//带头结点的单链表逆置.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;

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