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