已知一组整数已存入一个一维数组中,试用该组整数建立一个单链表,
再实现单链表的逆置操作。
———————————————————————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结构体
struct Node {
int data; // 数据域
struct Node* next; // 指针域
};
// 建立单链表的函数,返回链表头结点
struct Node* createLinkedList(int arr[], int n) {
struct Node *head, *p, *q;
int i;
head = (struct Node*)malloc(sizeof(struct Node)); // 创建头结点
p = head; // 初始化 p 指向头结点
for (i = 0; i < n; i++) {
q = (struct Node*)malloc(sizeof(struct Node)); // 创建新结点
q->data = arr[i]; // 新结点赋值
p->next = q; // 将新结点插入到链表中
p = q; // 将指针 p 移动到新结点
}
p->next = NULL; // 尾结点指向 NULL,表示链表结束
return head; // 返回头结点
}
// 逆置单链表的函数,返回链表头结点
struct Node* reverseLinkedList(struct Node* head) {
if (head == NULL || head->next == NULL) { // 空链表或只有一个结点的情况
return head; // 直接返回头结点
}
struct Node *p, *q, *r; // 定义三个指针,p 指向头结点,q 指向第一个结点,r 指向第二个结点
p = head;
q = head->next;
r = q->next;
p->next = NULL; // 将头结点的指针域设为 NULL,表示逆置后的尾结点
while (r != NULL) { // 逐个将结点插入到头结点之后
q->next = p; // q 的指针域指向上一个结点 p
p = q; // p 后移
q = r; // q 后移
r = r->next; // r 后移
}
q->next = p; // 最后一个结点 q 的指针域指向上一个结点 p
return q; // 返回逆置后的头结点
}
int main() {
int arr[] = {1, 2, 3, 4, 5}; // 测试数据
int n = sizeof(arr) / sizeof(int); // 数组长度
struct Node* head = createLinkedList(arr, n); // 建立单链表
printf("原链表:");
struct Node* p = head->next;
while (p != NULL) { // 遍历链表并输出
printf("%d ", p->data);
p = p->next;
}
printf("\n");
head->next = reverseLinkedList(head->next); // 逆置单链表
printf("逆置后的链表:");
p = head->next;
while (p != NULL) { // 遍历
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
供参考:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* next;
}Node, *List;
void createlist(List* L, int *a, int n)
{
int i;
List pL = NULL, pt = NULL;
for (i = 0; i < n; i++)
{
pt = (List)malloc(sizeof(Node));
pt->next = NULL;
pt->data = a[i];
if (!(*L))
(*L) = pt;
else
pL->next = pt;
pL = pt;
}
}
void printlist(List L)
{
List p = L;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void reverselist(List* L)
{
List pL = (*L), pt = NULL;
(*L) = NULL;
while (pL){
pt = pL;
pL = pL->next;
pt->next = (*L);
(*L) = pt;
}
}
int main()
{
int a[]={2,3,5,1,7,9,6,10,4};
List L = NULL;
createlist(&L, a, sizeof(a)/sizeof(a[0]));//创建链表
printlist(L); //输出链表
reverselist(&L); //逆置链表
printlist(L); //输出链表
return 0;
}