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

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个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;
    }
}
原文地址:https://www.cnblogs.com/WeiMLing/p/10894507.html