从尾到头打印链表

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个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

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

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

原文地址:https://www.cnblogs.com/zhao123/p/11133953.html