剑指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>)
{
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#篇)-- 从尾到头打印链表的更多相关文章
- 《剑指offer》— JavaScript(3)从尾到头打印链表
从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }* ...
- (剑指Offer)面试题5:从尾到头打印链表
题目: 输入一个链表的头结点,从尾到头反过来打印每个结点的值. 链表结点定义: struct ListNode{ int value; ListNode* pNext; }; 思路: 1.改变链表结构 ...
- 剑指offer第二版面试题5:从尾到头打印链表(JAVA版)
题目描述: 输入一个链表,从尾到头打印链表每个节点的值.返回新链表. import java.util.Stack; //定义链表结构 class ListNode { int value; List ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- 剑指Offer的学习笔记(C#篇)-- 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
- 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...
- 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将 num1[0], num2[0 ...
随机推荐
- StreamWriter结合UTF-8编码使用不当,会造成BOM(Byte Order Mark )问题生成乱码(转载)
问: I was using HttpWebRequest to try a rest api in ASP.NET Core MVC.Here is my HttpWebRequest client ...
- jQuery 的文档操作
在 js 中也有DOM操作,也可以进行 增删改查 ,但是通过 js 的DOM操作会发现,我的天哪,代码好多.但是 jQuery的文档操作就少了很多. js 中 DOM 的示例 : var box = ...
- 关于LCD的duty与bias
关于LCD的duty与bias 关于LCD的duty与bias duty: 占空比将所有公共电极(COM)各施加一次扫描电压的时间叫一帧,单位时间内扫描多少帧的频率叫帧频,将扫描公共电极(COM)选通 ...
- 3D立方体旋转动画
在线演示 本地下载
- 排序List集合
这两天写代码过程中遇到一个需求,需要按照某个字段排序List集合,自己实现了一半,发现网上有个更好的版本,就采用了这个,记录下来. 使用这个工具类要注意一个就是 如果你按照age 字段排序,那么age ...
- struts + hibernate笔记
1.hibernate: 1) Restrictions.eq 判断是否相等== (场景:一个类A中的属性t,这个属性t是另一个类B中的ID,找出输入为这个属性t的所有类A) tasks = ses ...
- not in和not exist的区别(转)
in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...
- bzoj 3685
线段树 方法一: 值域线段树,递归去写的,每次节点存出现次数. 对于几个操作, 1,2 直接加减就好 ; 3,4 操作贪心往某一个方向找 .7也很简单,主要说前驱后继怎么找.我是先找这个数第几小,根据 ...
- Linux下的磁盘缓存
转自:http://blog.csdn.net/cywosp/article/details/21126161 前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存.太多的磁 ...
- Codeforces Gym 101190 NEERC 16 .L List of Primes(递归)
ls特别喜欢素数,他总是喜欢把素数集合的所有子集写下来,并按照一定的顺序和格式.对于每一个子集,集合内 的元素在写下来时是按照升序排序的,对于若干个集合,则以集合元素之和作为第一关键字,集合的字典序作 ...