【数据结构】链表:JZ-6.从尾到头打印链表

写在开始 从今天开始刷牛客网的剑指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}的链表如下图: 【数据结构】链表:JZ-6.从尾到头打印链表 返回一个数组为[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;
    }
}  

 

 

 

 

上一篇:python屏蔽某个函数执行期间的标准输出


下一篇:学习笔记--Java中final关键字