Day55反转输出链表

74 阅读2分钟

Day05 2023/03/03

难度:简单

题目

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入L,2,3的链表如下图:

image.png

返回一个数组为(3,2,1) 0<=链表长度<=10000

示例1:

1 2 3

返回结果:

3 2 1

示例2:

67 0 24 58

返回结果:

58 24 0 67

思路:

  先用数组接受链表中的数据,然后对数组中的数进行反转;
  //定义一个变量表示链表长度,方便开数组;
  定义一个LIst Node 指向第一个节点;
  利用while循环得出链表长度
  开两个数组,一个用来按照链表顺序接收数值,第二个数组用来把第一个数组的值反过来 
  长度都为链表的长度
  利用第二个数组把第一个数组的值反过来
    经过上一步的i已经自增到数组的长度了,所以此时可以直接用

代码:

static int[] returnArr(ListNode node){
//定义一个变量表示链表长度,方便开数组;
    int length = 1;
//定义一个LIst Node 指向第一个节点;    
    ListNode temp = node;
//利用while循环得出链表长度    
    while (temp.next != null){
        length++;
        temp = temp.next;
    }
//在把temp指回第一个节点;    
    temp = node;
//开两个数组,一个用来按照链表顺序接收数值,第二个数组用来把第一个数组的值反过来 
//长度都为链表的长度
    int ans1[] = new int[length];
    int ans2[] = new int[length];
    int i = 0;
    while (temp != null){
    //i自增,把当前节点的值赋给数组之后,再把节点往后移
    //这边必须是i++
        ans1[i++] = temp.data;
        temp = temp.next;
    }
    //利用第二个数组把第一个数组的值反过来
    //经过上一步的i已经自增到数组的长度了,所以此时可以直接用
    //这边必须--i,如果是i--会越界,
    for (int j = 0; j < length; j++){
        ans2[j] = ans1[--i];
    }
    return ans2;
}
  • 时间复杂度 O(n)--- 创建链表的时间复杂度为O(n)
  • 空间复杂度 O(n)--- 链表属于必要空间,利用了两个数组;