ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-18 16:04:57  阅读:168  来源: 互联网

标签:listNode val JZ self next 链表 从尾 节点


写在开始 从今天开始刷牛客网的剑指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;
    }
}  

 

 

 

 

标签:listNode,val,JZ,self,next,链表,从尾,节点
来源: https://www.cnblogs.com/chenxiaomeng/p/15909001.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有