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