zoukankan      html  css  js  c++  java
  • 从尾到头打印链表

    题目描述

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

    解题思路

    输入一个链表,从尾到头输出,正常的遍历都是从头到尾输出,而这里需要从尾到头输出,那么就是“先进后出”,也就是栈的功能。

    代码实现

    栈的方式实现

    public static List<int> PrintForStack(ListNode nodes)
    {
        Stack<ListNode> listNodes = new Stack<ListNode>();
        ListNode node = nodes;
        while (node != null)
        {
            listNodes.Push(node);
            node = node.next;
        }
    
        List<int> list = new List<int>();
        foreach (var item in listNodes) {
            list.Add(item.item);
        }
        return list;
    }

    递归的方式实现

    public static List<int> PrintForRecursion(ListNode node) {
        List<int> listNodes = new List<int>();
        PrintForRecursion(node, listNodes);
        return listNodes;
    }
    
    private static void PrintForRecursion(ListNode node, List<int> list)
    {
        if (node != null) {
            if (node.next != null) {
                PrintForRecursion(node.next, list);
            }
            list.Add(node.item);
        }
    }

    想入非非:扩展思维,发挥想象

    目的:

    1. 熟悉链表

    2.熟悉栈(先进后出)

    3.熟悉递归

    扩展:

    1.输入一个链表,返回一个倒过来的链表

    public static ListNode PrintForReverse(ListNode nodes)
    {
        Stack<ListNode> listNodes = new Stack<ListNode>();
        ListNode node = nodes;
        while (node != null)
        {
            listNodes.Push(node);
            node = node.next;
        }
    
        ListNode reverseNode = listNodes.Pop();
        var temp = reverseNode;
        foreach (var item in listNodes)
        {
            item.next = null;
            temp.next = item;
            temp = item;
        }
        return reverseNode;
    }

    2.生成一个链表

    public static ListNode CreateNodeList(int length)
    {
        ListNode listNode = new ListNode(0);
        var temp = listNode;
        for (int i = 1; i < length; i++)
        {
            temp = nextList(temp, i);
        }
    
        return listNode;
    
        //下一个
        ListNode nextList(ListNode node, int value)
        {
            while (node.next != null)
            {
                node = node.next;
            }
            var next = new ListNode(value);
            node.next = next;
            return next;
        }
    }

    测试

    [Fact]
    public void TestList()
    {
        ListNode listNode = Coding003.CreateNodeList(10);
        List<int> test = Coding003.PrintForStack(listNode);
        for (int i = 0; i < 10; i++)
        {
            Assert.Equal(i, test[9 - i]);
        }
    
        List<int> test2 = Coding003.PrintForRecursion(listNode);
        for (int i = 0; i < 10; i++)
        {
            Assert.Equal(i, test2[9 - i]);
        }
    }
    
    [Fact]
    public void Test()
    {
        ListNode listNode = Coding003.CreateNodeList(10);
        string o = JsonConvert.SerializeObject(listNode);
    
        List<int> test = Coding003.PrintForStack(listNode);
        string t = JsonConvert.SerializeObject(test);
    
        List<int> test2 = Coding003.PrintForRecursion(listNode);
        string t2 = JsonConvert.SerializeObject(test2);
    
        ListNode test3 = Coding003.PrintForReverse(Coding003.PrintForReverse(listNode));
        string t3 = JsonConvert.SerializeObject(test3);
    
        Assert.Equal(test, test2);
        Assert.Equal(o, t3);
    }
    View Code

    面试题【字符串替换空格】

    面试题【二维数组中的查找】

  • 相关阅读:
    Effective Java第三版(一) ——用静态工厂代替构造器
    联合主键下的mapper文件对数据库的批量更新
    dart的基本语法(一)
    单例模式
    给hexo博客的NEXT主题添加一个云日历
    使用nginx+tomcat实现动静分离
    nginx(二)
    nginx(一)
    初识Nginx
    给hexo添加宠物
  • 原文地址:https://www.cnblogs.com/zhao123/p/11133953.html
Copyright © 2011-2022 走看看