前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer的学习笔记(C#篇)-- 从尾到头打印链表

剑指Offer的学习笔记(C#篇)-- 从尾到头打印链表

作者头像
WeiMLing
发布2019-08-23 19:42:41
4320
发布2019-08-23 19:42:41
举报
文章被收录于专栏:WeiMLingWeiMLing

题目描述

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

一 . 个人想法

这个题目搞了一段时间,因为解法好多,比如:是用递归法呢还是循环呢,要不要使用栈呢等等.. 所以,每一种想法都写一下吧,还有一点点的小细节什么的。

这个题目就不用解释了吧,举个例子:输入1→2→3→4→5,输出5→4→3→2→1。

二 . 解题方法

方法一:栈+循环

具体的思路:输入一个链表1(特点:先进先出) → 建一个栈(特点:先前后出)和一个链表2 → 把链表一的数据高进栈 → 把栈里的东西倒进链表2 → 结束!!(不明白看代码:注释很详细)

代码实现:

using System.Collections.Generic;
/*
public class ListNode
{
    public int val;
    public ListNode next;
    public ListNode (int x)
    {
        val = x;
    }
}*/
class Solution
{
    // 返回从尾到头的列表值序列
    //首先输入一个名为printListFromTailToHead的链表;List<int>为链表类型;ListNode listNode分别为指针和数据
    public List<int> printListFromTailToHead(ListNode listNode)
    {
        // write code here
        //定义一个名为stack的栈
        Stack<int> stack = new Stack<int>();
        //定义一个名为list的链表,即为最后输出的那个表
        List<int> list=new List<int>();
        //定义head指针
        ListNode head=listNode;
        //当输入的链表数据不为空时,执行进栈操作
        while(head!=null)
        {
            stack.Push(head.val);
            head=head.next;
        }
        //当栈的长度大于0时,出栈;出栈后的数据添加到名为list的链表
        while(stack.Count>0)
        {
            int item=stack.Pop();
            list.Add(item);
        }
        return list;
    }
}

方法二:链表+循环

具体的思路:使用两个链表,第一个正序输入,第二个倒着输入。

代码实现:

using System.Collections.Generic;
/*
public class ListNode
{
    public int val;
    public ListNode next;
    public ListNode (int x)
    {
        val = x;
    }
}*/
class Solution
{
    // 返回从尾到头的列表值序列
    public List<int> printListFromTailToHead(ListNode listNode)
    {      
            //定义一个新链表
            List<int> list = new List<int>();   
            //定义节点指向数据
            ListNode node = listNode;
            //输入的数据不为空的时候,就一直加
            while (node != null)
            {
                list.Add(node.val);
                node = node.next;
            }
            //定义第二个链表
            List<int> re = new List<int>();
            //从链表1的最后端倒序插入新链表
            for (int i = list.Count - 1; i > -1; i--)
            {
                re.Add(list[i]);
            }
            //返回新链表
            return re;
    }
}

方法三:递归

具体的思路:指针遍历,如果这个指针的下一位是空的,输出一个数;不为空就继续往下循环。还有一件事啊!就是,你只要用递归法,一定要搞好这个循环和终止条件!!不要弄成个死循环。

代码实现:

using System.Collections.Generic;
/*
public class ListNode
{
    public int val;
    public ListNode next;
    public ListNode (int x)
    {
        val = x;
    }
}*/
class Solution
{
    // 返回从尾到头的列表值序列
     
    public List<int> printListFromTailToHead(ListNode listNode)
    {
        // write code here
        //定义一个新链表
        List<int> list = new List<int>();
        //数据域不空,执行,空了的话,执行返回list
         if (listNode != null)
            {
                //下一个数据域还不空,递归!!
                if (listNode.next != null)
                {
                    //一开始我没用list=后面,直接写了后面的,老实说,我不是很懂为何加上,哎!!
                    list = printListFromTailToHead(listNode.next);
                }
                //如果下一个空了,就在这个链表上加上他!!
                list.Add(listNode.val);
            }
            //返回链表
            return list;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
      • 一 . 个人想法
        • 二 . 解题方法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档