前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指Offer】6. 从尾到头打印链表

【剑指Offer】6. 从尾到头打印链表

作者头像
瑞新
发布2020-12-07 14:19:43
2580
发布2020-12-07 14:19:43
举报
文章被收录于专栏:用户3288143的专栏

题目描述

从尾到头反过来打印出每个结点的值。

解题思路

使用递归

要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。

代码语言:javascript
复制
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> rel = new ArrayList<>();
        if(listNode != null) {
            rel.addAll(printListFromTailToHead(listNode.next));
            rel.add(listNode.val);
        }
        return rel; 
    }       
}

头插法

使用头插法可以得到一个逆序的链表。

头结点和第一个节点的区别:

  • 头结点是在头插法中使用的一个额外节点,这个节点不存储值;
  • 第一个节点就是链表的第一个真正存储值的节点。
代码语言:javascript
复制
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        // 头插法
        ListNode head = new ListNode(-1);
        while(listNode != null) {
            ListNode temp = listNode.next;
            
            listNode.next = head.next;
            head.next = listNode;
            
            listNode = temp;
        }
        
        // 返回值
        ArrayList<Integer> re = new ArrayList<>();
        head = head.next;
        while(head != null) {
            re.add(head.val);
            head = head.next;
        }
        
        return re;
    }       
}

使用栈

栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中,最后出栈的顺序即为逆序。

代码语言:javascript
复制
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
         Stack<Integer> stack = new Stack<>();
        while(listNode != null) {
            stack.add(listNode.val);
            listNode = listNode.next;
        }
        
        // 返回值
        ArrayList<Integer> re = new ArrayList<>();
        while(!stack.isEmpty()) {
            re.add(stack.pop());
        }
        
        return re;
    }       
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
    • 使用递归
      • 头插法
        • 使用栈
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档