10.链表-倒叙打印

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

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

 

 

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

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

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;

    }

}

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值