带头结点的单链表的逆置

 

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

}













 

转载于:https://www.cnblogs.com/loveyougkp/archive/2010/09/08/1821340.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值