c语言数据结构题从尾到头打印链表


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* reversePrint(struct ListNode* head, int* returnSize){
    struct ListNode* cur = head;
    struct ListNode* newNode = NULL;
    int j=0;
    while(cur)
    {
        ++j;
        struct ListNode* next = cur->next;
        cur->next = newNode;
        newNode = cur;
        cur = next;
    }
    
    *returnSize = j;
    int i=0;
    int *array = (int*)malloc(sizeof(int)*(j));
    while(cur)
    {
        array[i++] = cur->val;
        cur = cur->next;
    }
    return array;
}

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

。。我认为这个没有毛病,为什么结果只是地址呢

基于new bing的编写:
在这段代码中,存在一个问题是在反转链表的过程中,cur 指针已经被改变了,所以在第二个 while 循环中 cur 已经指向了 NULL。

应该在第二个 while 循环中使用 newNode 指针作为遍历链表的指针,因为它现在指向了反转后链表的头节点。修改后的代码如下:

int* reversePrint(struct ListNode* head, int* returnSize){
    struct ListNode* cur = head;
    struct ListNode* newNode = NULL;
    int j=0;
    while(cur)
    {
        ++j;
        struct ListNode* next = cur->next;
        cur->next = newNode;
        newNode = cur;
        cur = next;
    }
    
    *returnSize = j;
    int i=0;
    int *array = (int*)malloc(sizeof(int)*(j));
    while(newNode) // 使用 newNode 遍历链表
    {
        array[i++] = newNode->val;
        newNode = newNode->next;
    }
    return array;
}


  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7501306
  • 这篇博客也不错, 你可以看下C语言数组 :用户输入一个数, 我要用这个数当数组的长度。怎么办呢
  • 除此之外, 这篇博客: C语言实现扫雷游戏(第一次不被炸死;坐标周围没有雷时,可实现展开)中的 那么我们如何实现呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 定义两个二维数组:一个作为玩家棋盘,初始化为全 '  *';一个作为设计者棋盘,初始化为全'  0'。这里玩家棋盘自然是给玩家扫雷用的,而设计者棋盘可以显示雷的个数及分布情况,可供设计者检查程序代码是否正确。
    2. 通过设计者棋盘随机布一定数量的雷,这里我们约定雷的总数为10。(‘1’ 表示雷)
    3. 保证第一次不被炸死:如果设计者棋盘中该位置本身无雷则在玩家棋盘中显示该位置周围8个区域雷的个数并展开该位置周围无雷区域;否则先在设计者棋盘中将该位置改为无雷点并在玩家棋盘中显示其周围8个区域雷的个数并展开该位置周围无雷区域,再在设计者棋盘中随机找一个合法位置布一个雷。
    4. 判断输入后续坐标点时是否碰到雷,如果有则游戏结束,否则在玩家棋盘中显示该位置周围8个区域雷的个数并展开该位置周围无雷区域,直到玩家棋盘中'  *'的个数等于雷的总数,玩家赢。

    此时又出现一个问题:在计算某一位置周围8个区域雷的个数时,如果该位置在数组边界位置则会出现数组下标访问越界问题。

    所以,假如要打印10*10的棋盘,为了保证两个二维数组访问时的合法性,我们必须在其边界加上一圈元素,即变成了12*12的二维数组,如下图,但多加的这一圈元素不用打印出来,我们心里知道就行。

    真实打印的棋盘如下(为了便于输入坐标进行排雷,我们给该棋盘加上坐标编号):

     

     

     某一无雷坐标展开如下:

    在开始本次游戏编程前,我们先新建一个头文件(game.h:用来存放各种函数声明等)和两个源文件(game.c:存放各种函数具体实现;test.c:存放主函数)

  • 您还可以看一下 李老师老师的C语言版数据结构入门课程中的 数据结构入门简介小节, 巩固相关知识点

既然是通过数组返回链表的结点值,函数里不需把链表逆序后再装入数组,直接把链表结点值逆序存入数组即可,修改如下,供参考:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* reversePrint(struct ListNode* head, int* returnSize){
    struct ListNode* cur = head;
    int j=0;
    while(cur)
    {
        ++j;
        cur = cur->next;
    }
    *returnSize = j;
    int i=j-1;
    int *array = (int*)malloc(sizeof(int)*(j));
    cur = head;
    while(cur)
    {
        array[i--] = cur->val;
        cur = cur->next;
    }
    return array;
}