《剑指offer》3.从尾到头打印链表

《剑指offer》3.从尾到头打印链表

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

解题思路

1.对链表进行翻转,读取数据进ArrayList.
2.直接读取数据,从头部存入ArrayList.

Java 实现

直接读取,数组头部插入

import java.util.ArrayList;
public class Solution {
	public ArrayList<Intrger> printListFromTailToHead(ListNode listNode) {
		ArrayList list = new ArrayList();
		while(listNode != null){
			list.add(0, listNode.val);
			listNode = listNode.next;
		}
		return list;
	}
}

对链表指针进行翻转后,进行输出

import java.util.ArrayList;
public class Solution {
	// 从链表中读取数据进数组中
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ListNode reverNode = reverNode(listNode);   // 链表翻转
        
        ArrayList list = new ArrayList();            // 建立空数组
        while(reverNode != null){                    // 循环读取数据
            list.add(reverNode.val);
            reverNode =reverNode.next;
        }
        return list;
    }
    
    // 实现单向链表的翻转
    public static ListNode reverNode(ListNode Node){
    	// 如果链表为空或只有一个节点,直接返回原链表 
        if (Node == null || Node.next == null){
            return Node;
        }
        ListNode preNode = null;            // 链表前项节点指针
        ListNode curNode = Node;			// 链表当前节点指针
        ListNode nextNode = null;			// 链表后项节点指针
        
        while(curNode != null){             // 循环变更链表的指向
            nextNode = curNode.next;        // 后项指针,指向后一个节点
            curNode.next = preNode;			// 当前节点指针翻转指向前节点
            preNode = curNode;				// 前项指针,移动到当前节点
            curNode = nextNode;				// 当前指针,移动到下一个节点
        }
        return preNode;
    }
}

Python 实现

列表的反向: 1. list.reverse(); 2.反向切片[::-1] 3.手动序列赋值。

class Solution:
	def printListFromTailToHead(self, listNode):
		l = []
		while listNode:
			l.append(listNode.val)
			listNode = listNode.next
		return l[::-1]         # 反向打印

基于栈的递归(也可使用list的append,pop模拟栈改为迭代形式)

class Solution:
	l = []
	def printListFromTailToHead(self, listNode):
		if listNode:
			printListFromTailToHead(listNode.next)		# 递归调用
			l.append(listNode.val)						# 栈的作用,后节点数据先进入列表
		return l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无尽渊源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值