写在开始 从今天开始刷牛客网的剑指offer
因为:https://leetcode-cn.com/circle/article/s3RcOW/ 所以:我们不能在自己的 IDE 上刷题
刷题平台: https://www.nowcoder.com/ta/coding-interviews
解题思路:https://zhuanlan.zhihu.com/p/112990684
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。 如输入{1,2,3}的链表如下图: 返回一个数组为[3,2,1] 0 <= 链表长度 <= 10000输入:{1,2,3} 返回值:[3,2,1]
数据结构:链表
算法:递归
- 栈思想的数列实现
- 遍历一遍,存到一个数组中
- 反向打印这个数组
- 栈的思想,先把最后一个出栈的数,压入数组中
- 递归
-
- 递归的终止(基情况)
- 条件 head = None
- 返回 []
- 递归的过程(递归情况)
- 条件: head != None
- Do: 遍历链表(head.next),把数放入 array 中;返回:新构建的 array。
递归的思路就是遍历链表时,每次访问一个节点后,直接递归输出它的后面节点,再输出自己本身。也可以满足题意。不过递归的本质就是一个栈结构,原理都差不多。但是这样的话,当链表长度很长的时候,递归的层数就会变得很深,这时执行的效果就会不好。
【Python】
1.栈
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): lst,lst_bak = [],[] if not listNode: return lst while listNode: lst.append(listNode.val) listNode = listNode.next while lst: lst_bak.append(lst.pop()) return lst_bak
2.递归解法
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): if listNode is None: return [] return self.printListFromTailToHead(listNode.next) + [listNode.val]
3.用reverse和append
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code here l = [] while listNode: l.append(listNode.val) listNode = listNode.next l.reverse() return l
4.insert,insert的index表示插在这个index的后面
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code here l = [] while listNode: l.insert(0, listNode.val) listNode = listNode.next return l
穿插一个python ListNode 链表的小知识:
struct ListNode { int val; //定义val变量值,存储节点值 struct ListNode *next; //定义next指针,指向下一个节点,维持节点连接 }
- 在节点ListNode定义中,定义节点为结构变量。
- 节点存储了两个变量:value 和 next。value 是这个节点的值,next 是指向下一节点的指针,当 next 为空指针时,这个节点是链表的最后一个节点。
- 注意注意val只代表当前指针的值,比如p->val表示p指针的指向的值;而p->next表示链表下一个节点,也是一个指针。
- 构造函数包含两个参数 _value 和 _next ,分别用来给节点赋值和指定下一节点
【Java】
1.递归解法
public class Solution { ArrayList<Integer> arrayList=new ArrayList<Integer>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode!=null){ this.printListFromTailToHead(listNode.next); arrayList.add(listNode.val); } return arrayList; } }