如何填写翻转链表的reverse函数



#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的答案更为高效