剑指offer--JZ6 从尾到头打印链表

这篇具有很好参考价值的文章主要介绍了剑指offer--JZ6 从尾到头打印链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

剑指offer--JZ6 从尾到头打印链表

我写不出来,参考别人的代码后理清思路后再写的C语言版本,代码如下:

#include <stdio.h>
#include <stdlib.h>

// 单链表结点
struct ListNode {
    int val;
    struct ListNode* next;
};

// 在链表末尾插入结点
void append(struct ListNode** head, int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;

    if (*head == NULL) {
        *head = newNode;
    } else {
        struct ListNode* curr = *head;
        while (curr->next != NULL) {
            curr = curr->next;
        }
        curr->next = newNode;
    }
}

// 从尾到头返回链表节点值的数组
int* reversePrint(struct ListNode* head, int* returnSize) {
    // 统计链表节点数目
    int count = 0;
    struct ListNode* curr = head;
    while (curr != NULL) {
        count++;
        curr = curr->next;
    }

    // 创建结果数组
    int* result = (int*)malloc(sizeof(int) * count);
    *returnSize = count;

    // 将链表节点值倒序存入数组
    curr = head;
    for (int i = count - 1; i >= 0; i--) {
        result[i] = curr->val;
        curr = curr->next;
    }

    return result;
}

int main() {
    struct ListNode* head = NULL;

    // 在链表末尾插入结点
    append(&head, 1);
    append(&head, 2);
    append(&head, 3);

    int size;
    int* result = reversePrint(head, &size);

    // 打印结果数组
    for (int i = 0; i < size; i++) {
        printf("%d ", result[i]);
    }
    printf("\n");

    // 释放内存
    free(result);

    return 0;
}

最难理解的是创建结果数组那里。我竟然不知道有这种语法。我看了老半天。malloc动态申请的内存可以看作数组使用,而且能使用数组的方式来访问元素。

int* result = (int*)malloc(sizeof(int) * count);
result[i] = curr->val;

大致讲解下整体思路:

1.创建一个头结点head

2.利用尾插法开始插入结点,把值传入新结点空间中,然后修改next指针为空

如果头结点为空,那么将头节点指向新结点,如果不为空,创建一个新指针curr开始遍历找到末尾结点并且让末尾结点的next指针指向新结点

3.算出结点总数

4.通过Malloc动态创建一个结果数组。并将结点总数传入main函数的局部变量以便后续遍历。

5.将正向遍历链表的值反向插入数组中

6.for循环正向遍历数组得到反向的链表值文章来源地址https://www.toymoban.com/news/detail-510362.html

到了这里,关于剑指offer--JZ6 从尾到头打印链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 则依次打印出数字 数据范围: 0 = matrix.length = 100 0 = ma

    2024年02月10日
    浏览(32)
  • 剑指offer(C++)-JZ49:丑数(算法-其他)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺

    2024年02月03日
    浏览(35)
  • 剑指offer(C++)-JZ47:礼物的最大价值(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 在一个mtimes nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向

    2024年02月05日
    浏览(51)
  • 剑指offer(C++)-JZ12:矩阵中的路径(算法-回溯)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以

    2024年02月11日
    浏览(38)
  • 剑指offer(C++)-JZ13:机器人的运动范围(算法-回溯)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,

    2024年02月12日
    浏览(38)
  • 剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一

    2024年02月04日
    浏览(31)
  • 剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)。 数据范围: 0n≤200 进阶: 空间复杂度 O(1) ,时间复杂

    2024年02月09日
    浏览(34)
  • 剑指offer(C++)-JZ46:把数字翻译成字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 有一种将字母编码成数字的方式:\\\'a\\\'-1, \\\'b-2\\\', ... , \\\'z-26\\\'。 现在给一串数字,返回有多少种可能的译码结果 数据范围:字符串长度满足 0n≤90 进阶:空间复杂度

    2024年02月07日
    浏览(35)
  • 剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 数据范围:数组长度2≤n≤1000,数组中每个数

    2024年02月10日
    浏览(38)
  • 剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围:  s.length≤40000 s.length≤40000 示例: 输入: 返回值: 说明

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包