【数据结构】设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

编程题:

设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

分析:

该算法通过维护三个指针(prev、curr 和 next)逐步遍历单链表,实现链表的逆转。在遍历过程中,curr 的 next 指针被更新为指向 prev,逐步反转指向。最终,头结点的 next 指针指向新的头节点(即原链表的尾节点),从而完成链表的逆转。这一过程只需 (O(n)) 的时间复杂度和 (O(1)) 的空间复杂度。

cpp 复制代码
#include <stdio.h>

#if 0
typedef int ElemType;

typedef struct Lnode {
    ElemType data; // 数据域
    struct Lnode* next; // 指针域
} Lnode, * LinkList;

// 创建带头结点的单链表
LinkList createList() {
    LinkList head = (LinkList)malloc(sizeof(Lnode));
    head->next = NULL;
    // 这里可以添加其他节点以构造链表
    return head;
}

// 逆转带头结点的单链表
void reverseList(LinkList head) {
    Lnode* prev = NULL;
    Lnode* curr = head->next; // 从头结点的下一个开始
    Lnode* next;

    while (curr) {
        next = curr->next; // 保存下一个节点
        curr->next = prev; // 反转当前节点的指针
        prev = curr; // 移动 prev 指针
        curr = next; // 移动 curr 指针
    }

    head->next = prev; // 头结点的 next 指向新的头结点
}

// 打印链表
void printList(LinkList head) {
    Lnode* temp = head->next; // 从头结点的下一个开始
    while (temp) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    LinkList list = createList();

    // 添加十个节点到链表
    for (int i = 1; i <= 10; i++) {
        Lnode* newNode = (Lnode*)malloc(sizeof(Lnode));
        newNode->data = i;
        newNode->next = NULL;

        Lnode* temp = list; // 找到链表的最后一个节点
        while (temp->next) {
            temp = temp->next;
        }
        temp->next = newNode; // 将新节点添加到链表末尾
    }

    printf("Original List:\n");
    printList(list);

    reverseList(list);

    printf("Reversed List:\n");
    printList(list);

    // 释放链表的内存
    Lnode* temp;
    while (list->next) {
        temp = list->next;
        list->next = temp->next;
        free(temp);
    }
    free(list);

    return 0;
}

#endif

考试写:

cpp 复制代码
// 逆转带头结点的单链表
void reverseList(LinkList head) {
    Lnode* prev = NULL;
    Lnode* curr = head->next; // 从头结点的下一个开始
    Lnode* next;

    while (curr) {
        next = curr->next; // 保存下一个节点
        curr->next = prev; // 反转当前节点的指针
        prev = curr; // 移动 prev 指针
        curr = next; // 移动 curr 指针
    }

    head->next = prev; // 头结点的 next 指向新的头结点
}

解法不唯一,欢迎评论区交流。

相关推荐
Mr Xu_10 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX10 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊11 小时前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif12311 小时前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
徐小夕@趣谈前端11 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
Nebula_g12 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie9913 小时前
day 23 树
数据结构
EnglishJun14 小时前
数据结构的学习(四)---栈和队列
数据结构·学习
数智工坊14 小时前
【数据结构-特殊矩阵】3.5 特殊矩阵-压缩存储
数据结构·线性代数·矩阵
芝士爱知识a14 小时前
AlphaGBM 深度解析:下一代基于 AI 与蒙特卡洛的智能期权分析平台
数据结构·人工智能·python·股票·alphagbm·ai 驱动的智能期权分析·期权