劍指Offer的學習筆記(C#篇)-- 從尾到頭打印鏈表

題目描述

輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。

一 . 我的想法

        這個題目搞了一段時間,由於解法好多,好比:是用遞歸法呢仍是循環呢,要不要使用棧呢等等.. 因此,每一種想法都寫一下吧,還有一點點的小細節什麼的。node

        這個題目就不用解釋了吧,舉個例子:輸入1→2→3→4→5,輸出5→4→3→2→1。後端

二 . 解題方法

方法一:棧+循環spa

        具體的思路:輸入一個鏈表1(特色:先進先出) →  建一個棧(特色:先先後出)和一個鏈表2  →  把鏈表一的數據高進棧  →  把棧裏的東西倒進鏈表2  →  結束!!(不明白看代碼:註釋很詳細)指針

代碼實現:code

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;
    }
}

方法二:鏈表+循環
blog

        具體的思路:使用兩個鏈表,第一個正序輸入,第二個倒着輸入。遞歸

代碼實現:it

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;
    }
}

方法三:遞歸io

        具體的思路:指針遍歷,若是這個指針的下一位是空的,輸出一個數;不爲空就繼續往下循環。還有一件事啊!就是,你只要用遞歸法,必定要搞好這個循環和終止條件!!不要弄成個死循環。class

代碼實現:

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;
    }
}
相關文章
相關標籤/搜索