#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
struct Node { // 定义结点结构体
int data;
Node* next;
};
typedef Node* list; // 所谓单链表,就是指向头结点的指针
list Init(); // 创建并返回带头结点的空链表
void PushFront(list l, int data); // 在单链表的最前面插入一个数值域为data的节点
void PrintList(list l); // 打印单链表
void Reverse(list l); // 单链表逆序
int main() {
list l = Init(); // 创建并初始化一个带头结点的单链表
for (int i = 1; i <= 9; ++i) // 把1~9依次插入到单链表的最前面
PushFront(l, i);
PrintList(l); // 9->8->7->6->5->4->3->2->1
Reverse(l); // 逆序
PrintList(l); // 1->2->3->4->5->6->7->8->9
}
// 创建并返回带头结点的空链表
list Init() {
Node* p = new Node{ 0,nullptr }; // 创建头结点,数值域为0,指针域为空
return p;
}
// 打印单链表
void PrintList(list l) {
Node* p = l->next; // p指向第一个节点
while (p != nullptr) { // 当p不为空
printf("%d", p->data); // 输出p的数值域
p = p->next; // p指向下一个节点
if (p) printf("->"); // 如果有下一个节点,输出箭头
}
printf("\n");
}
// 在单链表的最前面插入一个数值域为data的节点
void PushFront(list l, int data) {
Node* p = new Node{ data, l->next };
l->next = p;
}
void Reverse(list l) {
请填写代码
}
void Reverse(list l)
{
Node *p = l->next; // p指向当前节点
Node *prev = nullptr; // prev指向前一个节点
while (p) {
Node *next = p->next;
p->next = prev; // 反转
prev = p; // 移到下一个节点
p = next;
}
l->next = prev; // 让头节点指向最后一个节点
}
循环获得尾节点,将头节点的next指向尾节点
void Reverse(list l) {
list p=l;
list q = l->next;
list n = NULL;
while(n != l->next)
{
while(q->next != n)
q = q->next;
p->next = q;
p = q;
n = q;
q = l;
}
p->next = NULL;
}
2L的答案更为高效