题目描述

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

剑指Offer的学习笔记(C#篇)-- 从尾到头打印链表的更多相关文章

  1. 《剑指offer》— JavaScript(3)从尾到头打印链表

    从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }* ...

  2. (剑指Offer)面试题5:从尾到头打印链表

    题目: 输入一个链表的头结点,从尾到头反过来打印每个结点的值. 链表结点定义: struct ListNode{ int value; ListNode* pNext; }; 思路: 1.改变链表结构 ...

  3. 剑指offer第二版面试题5:从尾到头打印链表(JAVA版)

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值.返回新链表. import java.util.Stack; //定义链表结构 class ListNode { int value; List ...

  4. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  5. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  6. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...

  7. 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...

  8. 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  9. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  10. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

随机推荐

  1. java多线程---基础

    一, java多线程----线程与进程 进程: 程序(任务)的执行过程,拥有资源(共享内存,共享资源)和线程(一个或者多个,至少一个).  例如:打开任务管理器,qq,chrome,都属于进程. 线程 ...

  2. 2 《锋利的jQuery》jQuery选择器

    tip1:jquery检查某个元素是否存在:if($("#tt").length>0){}或者if($("#tt")[0]){} 先说css选择器有: 标 ...

  3. Spring Boot2.0之 yml的使用

    yml Spring Boot 默认读取   .yml   .properties 结尾的 yml非常好的作用,比properties更节约  结构清晰 server: port:  8090 con ...

  4. ssh_jar包选择

    1.struts2.3.29 + spring-framework-3.2.9.RELEASE +hibernate-distribution-3.6.10 * struts 所需jar 在:如下所示 ...

  5. python循环次数的使用

    a=[str(i) for i in range(88888,88912)] b=[str(i) for i in range(77777,77785)] def f(a,b,k=0,m=0): n= ...

  6. 手机移动端网站开发流程HTML5

    手机移动端网站开发流程HTML5 最近一直在研究移动手机网站的开发,发现做手机网站没有想象中的那么难.为什么会这么说呢?我们试想下:我们连传统的PC网站都会做,难道连一个小小的手机网站难道都搞不定吗? ...

  7. 文件操作:os模块与os.path模块

    一.os与os.path 原创:http://www.cnblogs.com/lovemo1314/archive/2010/11/08/1871781.html os模块用于处理文件及文件夹,包括文 ...

  8. 【Shell】通配符与特殊符号

    ——来自<鸟哥的Linux私房菜> 在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理数据就更方便了!底下列出一些常用的通配 ...

  9. CSDN不登陆看博文

    做前端的朋友说,手动改太Low,给了段JS代码: javascript: void((function() {var divElement = document.getElementById('art ...

  10. 集训Day4

    在bzoj刷了好几天杂题感觉手感不是很好 继续回来集训一下 好几天没更新了啊... bzoj1875 一个无向图,一个人要从起始点走$t$步走到终点,不能沿着刚走过来那条边回去,问有多少种走法 $m ...