单链表的逆序
创建结构体
struct lb{
int a;
lb* next = NULL;
};
struct lb* head, * p1, * p2,*h,*z;
创建链表函数
void creatlb(int n) {
head = (struct lb*)malloc(sizeof(struct lb));
p2 = head;
for (int i = 1; i <= n; i++)
{
p1 = (struct lb*)malloc(sizeof(struct lb));
cin >> p1->a;
p1->next = NULL;
p2->next = p1;
p2 = p1;
}
}
逆序转换函数
struct lb* convert(lb* p) {
struct lb * a , * b;
a= p;
p= NULL;
while (a)
{
b = a;
a = a->next;
b->next = p;
p = b;
}
return p;
}
单链表链接的方向是单向的,所以我们要想达到逆序的效果,方法就是把第一段(我们把这一段命名为X1)的链接指针变量断开指向空值(NULL)作为逆序的最后一段,然后将第二段(我们把这一段命名为X2)的连接指针变量指向X1。然后我们把操作对象转为X2-->next 第三段(我们把这一段命名为X3) 的连接指针变量指向X2。循环做直到Xn-->next 为NULL空,我们把Xn-->next 指向 Xn-1 完事。
整体代码
#include <iostream>
using namespace std;
struct lb{
int a;
lb* next = NULL;
};
struct lb* head, * p1, * p2,*h,*z;
void creatlb(int n) {
head = (struct lb*)malloc(sizeof(struct lb));
p2 = head;
for (int i = 1; i <= n; i++)
{
p1 = (struct lb*)malloc(sizeof(struct lb));
cin >> p1->a;
p1->next = NULL;
p2->next = p1;
p2 = p1;
}
}
void print(lb* p)
{
while (p != NULL)
{
printf("%d\n", p->a);
p = p->next;//移到下一个
}
}
struct lb* convert(lb* p) {
struct lb * a , * b;
a= p;
p= NULL;
while (a)
{
b = a;
a = a->next;
b->next = p;
p = b;
}
return p;
}
int main() {
int n;
cin >> n;
creatlb(n);
struct lb * p = head->next;
struct lb*aa= convert(head);
print(aa);
}