题目:设有一个表头指针为h的单链表。编写一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转。
思路:
代码实现:
#include <cstdio>
#include <cstdlib>
typedef int DataType;
typedef struct node{
DataType val;
struct node *next;
}LinkList;
void Init_List(LinkList *&L){
L = (LinkList*) malloc(sizeof(LinkList));
L->next = NULL;
}
void Create_List(LinkList *&L){
LinkList *first = L;
int val, n;
printf("请输入要处理的序列的个数:");
scanf("%d", &n);
if (n == 0) return;
printf("请输入%d个数据:", n);
for (int i = 0; i < n; i++){
scanf("%d", &val);
LinkList *q = (LinkList* ) malloc(sizeof(LinkList));
q->val = val;
first->next = q;
first = q;
}
first->next = NULL;
}
void Print(LinkList *&L){
// 创建头指针,进行遍历输出单链表中的元素的个数
LinkList *first = L->next;
while(first != NULL){
printf("%d ", first->val);
first = first->next;
}
}
void Reverse(LinkList *&L){
// 利用三个指针,分别指向三个节点,进行连接转移
LinkList *q1 = L->next, *q2 = L->next->next, *q3 = L->next->next->next;
q1->next = NULL;
while (q3 != NULL){
q2->next = q1;
q1 = q2;
q2 = q3;
q3 = q3->next;
}
q2->next = q1;
L->next = q2;
Print(L);
}
int main(){
LinkList *L;
Init_List(L);
Create_List(L); // 利用前插法存入数据
// 单链表逆转
if (L->next == NULL) printf("序列为空。");
else Reverse(L);
}