• 剑指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;
        }
    }
  • 相关阅读:
    【转】如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
    【转】PCIe DMA
    【转】PCIe学习(二)——PCIe DMA关键模块分析之一
    PCIe配置空间
    [转]PCIe学习笔记之MSI/MSI-x中断及代码分析
    [转]常用通信接口保护电路
    [转]原理图和PCB元件对应查找--Altium Designer
    [原]PCB中MARK点制作
    [转]使用Altium Designer软件铺铜后再挖铜
    支持Json进行操作的Javascript类库TAFFY DB
  • 原文地址:https://www.cnblogs.com/WeiMLing/p/10894507.html
Copyright © 2020-2023  润新知