10.链表-倒叙打印

本文介绍如何从尾到头打印链表的每个节点值。主要探讨了递归和栈两种方法。递归解法中,当链表节点不为空时,递归调用自身处理下一个节点,直至最后一个节点,然后逐级返回并添加节点值到结果列表。栈解法则通过将链表节点依次压入栈中,然后依次弹出并添加到结果列表,实现链表倒序打印。

输入一个链表,从尾到头打印链表每个节点的值。

 

 

除了可以用翻转链表外,还有两种方法,递归与栈。

重点讲一下递归的(渣渣思考了挺久的):

package facehandjava.Linked;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class DGReversal {
    public static void main(String[] args) {

        Node n6 = new Node(11,null);
        Node n5 = new Node(9, n6);
        Node n4 = new Node(7, n5);
        Node n3 = new Node(5, n4);
        Node n2 = new Node(3, n3);
        Node n1 = new Node(1, n2);
//        n6.setNext(n4);
        System.out.println("++++++++++++前++++++++++++");
        Node now = n1;
        while (now != null) {
            System.out.print(now.getVal()+",");
            now = now.getNext();
        }
        list = DGReversal(n1);
        System.out.println();
        System.out.println("++++++++++++后++++++++++++");
        for (Integer integer : list) {
            System.out.print(integer+",");
        }
    }

    public static ArrayList<Integer> list = new ArrayList<>();
    public static ArrayList<Integer> DGReversal(Node node) {
        if (node != null) {
            DGReversal(node.getNext());
            list.add(node.getVal());
        }
        return list;
    }
}

 

大概解释一下,就是链表节点不为空的话,节点指向next继续循环那个函数,直到循环完最后一个节点,最后节点.next为空了,函数开始返回list=null给最后节点的函数,意味着最后一个节点的函数结束,并且执行list.add(最后节点的值),然后返回这个list给倒数第二节点函数;倒数第二个节点收到最新return的list后也意味着它的函数结束,再执行list.add……重复这个过程直到第一个节点函数结束,再list.add第一个节点,最终返回list。得到链表的倒置。估计很难看文字看懂,直接上图吧,手稿,有点大鱼吃小鱼的感觉。

 

/**

*       栈比较直观也比较简单,就直接摆上代码了。

*   public class ListNode {

*       int val;

*       ListNode next = null;

*

*       ListNode(int val) {

*           this.val = val;

*       }

*   }

*

*/

import java.util.ArrayList;

import java.util.Stack;

public class Solution {

   public ArrayList<Integer> printListFromTailToHead(ListNodelistNode) {

       ArrayList<Integer> list = new ArrayList<>();

       Stack<Integer> stack = new Stack<Integer>();

       while(listNode!=null){

           stack.push(listNode.val);

           listNode=listNode.next;

       }

       while(!stack.isEmpty()){

           list.add(stack.pop());

       }

       return list;

    }

}

 

 


<think> 首先,用户查询的关键是:"我想查找实现倒叙输出100 - 1之间偶数的方法"。所以是关于如何输出从100到1之间的偶数,倒序,意思是降序输出。 用户提供了几个引用,但强调这些引用仅供参考,我需要基于用户的当前查询来回答。用户上一次查询是相似的,但我没有之前的对话历史,所以直接处理当前查询。 分解查询: - 输出范围:100到1(包括100和1) - 只输出偶数 - 倒序:即从大到小输出,100,98,96,...,2 在编程中,实现这个的常见方法是使用循环或列表推导。 用户引用的内容中,有Python代码示例,比如求和的例子,所以我应该用Python来回答,因为用户提到了Python代码。 引用[1]中有Python代码: - 求1-100的和 - 求1-100所有偶数的和 - 输入数字求和平均 - 输入三位数倒序输出 引用[2]是关于链表和回文检查的,似乎不直接相关。 引用[3]是C语言输出数组倒序。 引用[4]是Python类型转换。 既然用户提到了Python代码的例子,我应该用Python来实现这个倒序输出偶数的功能。 方法: 1. 使用for循环或while循环,从100递减到1,步长为-2(因为偶数是每隔一个数),但需要确保只输出偶数。 2. 或者,生成一个列表包含100到1的偶数,然后输出。 更高效的方式是直接循环从100到1,步长为-2。 在Python中,可以使用range函数:range(100, 0, -2) - start: 100 - end: 0 (但不包括0,所以到1) - step: -2 range(100, 0, -2) 会产生100, 98, 96, ..., 2。这不包括1,因为step是-2,所以只会停在2。 100是偶数,2是偶数,都是偶数,所以完美。 然后,输出这些数字。 在代码中,可以遍历这个range并打印每个数字。 用户提到"倒叙输出",可能是个拼写错误,应该是"倒序输出",意思是逆序输出。 在引用[1]中,有倒序输出三位数的代码,但那是一个数字的逆序,不是序列的逆序。 对于序列输出,从大到小就是逆序。 现在,构建回答: - 结构清晰:先解释方法,然后给出代码示例。 - 使用中文回答。 - 生成相关问题。 - 末尾添加引用标识。 回答结构: 1. 简要介绍如何实现。 2. 给出Python代码示例。 3. 解释代码。 4. 生成相关问题。 代码示例: ```python # 倒序输出100到1之间的偶数 for num in range(100, 0, -2): print(num) ``` range(start, stop, step): - start=100: 起始值 - stop=0: 结束值,但不包括0,所以到1之前 - step=-2: 步长,负数表示递减 这样,num 会从100开始,每次减去2,直到2(因为100,98,...,2,然后下一个是0,但stop=0不包括0,所以停止在2)。 输出:100,98,96,...,2。 1是奇数,不会被包括,因为没有1。 范围是从100到1,包括两端?100是偶数,1是奇数,所以只输出偶数到2是合理的。 用户说:"100 - 1之间偶数",100和1都是边界,但1是奇数,所以从100到2的偶数是正确的。 在代码中,使用print(num)输出每个数字。 为了更像用户引用的代码风格,可以使用while循环,但range更简洁。 用户引用的代码中有while循环的例子。 例如: num = 100 while num >= 1: if num % 2 == 0: # 检查偶数 print(num) num -= 1 但这个方法效率较低,因为需要检查每个数是否是偶数,而range方法直接跳过奇数。 range方法更好。 生成相关问题: 基于这个主题,生成一些相关问题。 例如: 1. 如何输出1到100之间的所有奇数? 2. 如何用其他编程语言实现这个功能(如Java或C)? 3. 如何在输出时添加格式化,比如每行输出多个数字? 4. 如何将这些数字存储到一个列表中? 确保回答真实可靠。 引用标识:用户提供了一些引用,但说它们仅供参考,所以我应该在回答中自然地引用相关部分。 在用户引用中,引用[1]有Python代码,引用[3]有C语言倒序输出数组的例子。 所以,在解释时可以提及。 但用户说"上述引用仅供参考",所以我不要过度依赖。 最终回答: - 开头解释。 - 给出代码。 - 简要解释。 - 生成相关问题。 - 添加引用标识,例如[^1],但用户没有具体来源,所以可以用[^1]引用用户提到的引用,但要注明。 用户消息中已经有[^1], [^2]等,所以我可以在回答中使用类似标识。 在系统指令中,说"回答中引用的段落末尾自然地添加引用标识",但这里没有外部引用,只有用户提供的引用。 或许我可以提到参考了用户提供的代码示例。 例如,在代码解释中说类似引用[1]中的做法。 但最好保持简单。 现在,完整回答。 </think> 根据您的查询,我将解释如何实现倒序输出100到1之间偶数的方法(注意:“倒叙”应为“倒序”,意指从大到小输出)。我会使用Python语言实现,因为您在引用中提供了Python代码示例。核心思路是:生成一个从100开始递减到2的偶数序列(100是偶数,1是奇数,因此范围到2结束),并使用循环输出。以下是我逐步实现的详细说明和代码。 ### 实现方法 1. **关键点**: - 输出范围:100到1(包括100和1),但1是奇数,所以实际输出100、98、96、...、2等偶数。 - 倒序:从100开始递减输出。 - 高效性:直接使用步长为-2的递减循环,避免检查每个数的奇偶性(提高效率)。 2. **Python代码示例**: ```python # 倒序输出100到1之间的偶数 for num in range(100, 0, -2): # range(start, stop, step): 从100递减到1(不包括stop值0),步长-2 print(num) ``` - **代码解释**: - `range(100, 0, -2)`:生成一个序列,起始为100,结束为0(但不包括0),步长为-2,因此序列为100, 98, 96, ..., 2。 - `print(num)`:输出每个数字。 - 这段代码简洁高效,时间复杂度为 $O(n)$,无需额外判断奇偶性,因为步长-2确保只处理偶数。 - **输出示例**: ``` 100 98 96 ... 2 ``` 3. **替代方法(使用while循环)**: 如果您更习惯while循环(类似引用[1]中求偶数和的方式),可以这样实现: ```python num = 100 # 起始值 while num >= 2: # num >= 2 确保输出到最小偶数 print(num) num -= 2 # 每次减2,直接跳过奇数 ``` - **优点**:逻辑更直观,适合初学者。 - **缺点**:相比range方法稍微冗长。 ### 为什么这个方法有效? - 在编程中,倒序输出序列通常通过递减循环实现(引用[3]中C语言数组倒序输出类似)。 - 直接使用步长为-2,避免了在循环中检查 `num % 2 == 0` 的开销(引用[1]中求偶数和时使用了这种检查,但步长方式更高效)[^1]。 ### 相关问题 基于这个主题,我生成了以下相关问题,帮助您深入理解: 1. 如何输出1到100之间的所有奇数(正序或倒序)? 2. 如何用其他编程语言(如Java或C)实现倒序输出指定范围内的偶数? 3. 如何在输出时添加格式化(例如每行输出多个数字,或用逗号分隔)? 4. 如何将这些偶数存储到一个列表或文件中,以便后续使用? 如果您有其他具体要求(如优化性能或语言转换),请随时补充![^1][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值