当前位置:首页 C++ > 正文

本题要求C++实现一个函数,将给定的单链表逆转

作者:野牛程序员:2023-03-18 19:06:14 C++阅读 2398

函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node {    ElementType Data; /* 存储结点数据 */    PtrToNode   Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Reverse要返回被逆转后的链表。


#include <iostream>

using namespace std;

typedef struct Node *PtrToNode;
struct Node {
    int Data; // 存储结点数据
    PtrToNode Next; // 指向下一个结点的指针
};
typedef PtrToNode List; // 定义单链表类型

List CreateList(int n); // 创建链表
void PrintList(List L); // 输出链表
List Reverse(List L); // 单链表逆转

int main() {
    int n;
    cin >> n; // 输入链表长度
    List L = CreateList(n); // 创建链表
    cout << "Original List: ";
    PrintList(L); // 输出原链表
    L = Reverse(L); // 单链表逆转
    cout << "Reversed List: ";
    PrintList(L); // 输出逆转后的链表
    return 0;
}

List CreateList(int n) {
    List L = NULL, tail = NULL;
    for (int i = 0; i < n; i++) {
        int data;
        cin >> data; // 输入节点数据
        PtrToNode newNode = new Node; // 创建新节点
        newNode->Data = data; // 节点数据赋值
        newNode->Next = NULL; // 节点next指针置为空
        if (L == NULL) {
            L = newNode; // 第一个节点
        } else {
            tail->Next = newNode; // 将新节点链接到链表尾部
        }
        tail = newNode; // 更新链表尾指针
    }
    return L;
}

void PrintList(List L) {
    while (L != NULL) {
        cout << L->Data << " ";
        L = L->Next;
    }
    cout << endl;
}

List Reverse(List L) {
    if (L == NULL || L->Next == NULL) {
        return L; // 空链表或只有一个节点,直接返回
    }
    // 迭代法
    // PtrToNode pre = nullptr, cur = L, nxt = nullptr;
    // while (cur != nullptr) {
    //     nxt = cur->Next; // 记录下一个节点
    //     cur->Next = pre; // 当前节点的next指针指向前一个节点
    //     pre = cur; // 更新前一个节点
    //     cur = nxt; // 更新当前节点
    // }
    // return pre; // 返回新的头节点
    // 递归法
    PtrToNode newHead = Reverse(L->Next); // 递归到链表尾部,得到新的头节点
    L->Next->Next = L; // 将当前节点的next指针指向前一个节点
    L->Next = NULL; // 将当前节点的next指针置为空,防止形成环
    return newHead; // 返回新的头节点
}

typedef struct Node *PtrToNode; 这条语句的意思是:将 struct Node * 类型定义为 PtrToNode 类型,方便后续使用。在 C 语言中,由于 struct 关键字必须出现在结构体名称前面,因此使用结构体指针类型需要写成 struct Node *,比较繁琐。为了方便使用,可以使用 typedef 来给结构体指针类型取一个简短的别名,这样就可以写成 PtrToNode,代码更加简洁。

例如,在下面的代码中,PtrToNode 就是 struct Node * 的别名:

typedef struct Node *PtrToNode;

struct Node {
    int data;
    PtrToNode next;
};

PtrToNode create_node(int data) {
    PtrToNode p = malloc(sizeof(struct Node));
    p->data = data;
    p->next = NULL;
    return p;
}

这样就可以通过 PtrToNode 类型来声明一个结构体指针变量,例如:

PtrToNode p = create_node(123);

运行程序,输入如下样例数据:
6
1 2 3 4 5 6


程序将输出如下结果:

Original List: 1 2 3 4 5 6 
Reversed List: 6 5 4 3 2 1


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击