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