P51、面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 链表结点定义如下: Struct ListNode{ int m_nKey; ListNode* m_pNext; }; |
我们可以用栈来实现“后进先出”的顺序。每经过一个结点的时候,把该结点防到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
- void PrintListReversingly_Iteratively(ListNode* pHead){
- std::stack<ListNode*> node;
- ListNode* pNode = pHead;
- while(pNode != null){
- nodes.push(pNode);
- pNode = pNode->m_pNext;
- }
- while(!nodes.empty()){
- pNode = nodes.top();
- printf("%d\t",pNode->m_nValue);
- nodes.pop();
- }
- }
我们也可以用递归来实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
- void PrintListReversingly_Recursively(ListNode* pHead){
- if(pHead != null){
- if(pHead->m_pNext != null){
- PrintListReversingly_Recursively(pHead->m_pNext);
- }
- printf("%d\t",pHead->m_nValue);
- }
- }
java精简版:
Node类:
- package com.yyq;
- /**
- * Created by Administrator on 2015/9/8.
- */
- public class Node {
- String value;
- Node next;
- public Node(String value){
- this.value = value;
- }
- public String getValue() {
- return value;
- }
- public Node getNext() {
- return next;
- }
- public void setNext(Node next) {
- this.next = next;
- }
- public void setValue(String value) {
- this.value = value;
- }
- };
处理类:
- package com.yyq;
- import java.util.Stack;
- /**
- * Created by Administrator on 2015/9/8.
- */
- public class PrintLinkReversingly {
- public static void main(String[] args) {
- Node a = new Node("A");
- Node b = new Node("B");
- Node c = new Node("C");
- Node d = new Node("D");
- Node e = new Node("E");
- Node f = new Node("F");
- Node g = new Node("G");
- a.next = b;
- b.next = c;
- c.next = d;
- d.next = e;
- e.next = f;
- f.next = g;
- printTailToStartRec(a);
- printTailToStartStack(a);
- }
- public static void printTailToStartRec(Node start) {
- if (start == null ) return;
- if (start.next!= null) {
- printTailToStartRec(start.next);
- }
- System.out.println(start.value);
- }
- private static void printTailToStartStack(Node node) {
- if (node == null) {
- System.out.println("list is null");
- return;
- }
- Stack<Node> stack = new Stack<Node>();
- while (node != null) {
- stack.push(node);
- node = node.next;
- }
- while (!stack.isEmpty()) {
- System.out.println(stack.pop().value);
- }
- }
- }
输出结果:
F E D C B A G F E D C B A Process finished with exit code 0 |
java版本:
链表接口定义:
- package com.yyq;
- /**
- * Created by Administrator on 2015/9/4.
- */
- public interface Link {
- //向链表增加数据
- void add(Object data);
- //可以增加一组对象
- void add(Object data[]);
- //在链表中删除数据
- void delete(Object data);
- //判断数据是否存在
- boolean exists(Object data);
- //取得全部的保存对象
- Object[] getAll();
- //根据保存的位置取出指定对象
- Object get(int index);
- //求出链表的长度
- int length();
- }
链表类定义:
- package com.yyq;
- /**
- * Created by Administrator on 2015/9/4.
- */
- public class LinkImpl implements Link {
- class Node {
- private Object data;
- private Node next;
- public Node(Object data) {
- this.data = data;
- }
- public void addNode(Node newNode) {
- if (this.next == null) {
- this.next = newNode;
- } else {
- this.next.addNode(newNode);
- }
- }
- public void deleteNode(Node previous, Object data) {
- if (this.data.equals(data)) {
- previous.next = this.next;
- } else {
- if (this.next != null) {
- this.next.deleteNode(this, data);
- }
- }
- }
- public void getAll() {
- retdata[foot++] = this.data; //取出当前节点中的数据
- if (this.next != null) {
- this.next.getAll();
- }
- }
- };
- private int foot = 0;
- private Node root; //根节点
- private int len;
- private Object retdata[];//接收全部的返回值数据
- //向链表增加数据
- @Override
- public void add(Object data) {
- if (data != null) {
- len++; //保存个数
- Node newNode = new Node(data);
- if (this.root == null) {
- this.root = newNode;
- } else {
- this.root.addNode(newNode);
- }
- }
- }
- //可以增加一组对象
- @Override
- public void add(Object data[]) {
- for(int x = 0; x < data.length; x++){
- this.add(data[x]);
- }
- }
- //在链表中删除数据
- @Override
- public void delete(Object data) {
- if(this.exists(data)){//如果存在,则执行删除
- if(this.root.equals(data)){
- this.root = this.root.next;
- }else {
- this.root.next.deleteNode(this.root,data);
- }
- }
- }
- //判断数据是否存在
- @Override
- public boolean exists(Object data) {
- if(data == null){
- return false;
- }
- if(this.root == null){
- return false;
- }
- Object d[] = this.getAll();//取得全部的数据
- boolean flag = false;
- for(int x = 0; x < d.length; x++){
- if(data.equals(d[x])){
- flag = true;
- break;
- }
- }
- return flag;
- }
- //取得全部的保存对象
- @Override
- public Object[] getAll() {
- this.foot = 0;
- if(this.len != 0){
- this.retdata = new Object[this.len];//根据大小开辟数组
- this.root.getAll();
- return this.retdata;
- }else{
- return null;
- }
- }
- //根据保存的位置取出指定对象
- @Override
- public Object get(int index) {
- Object d[] = this.getAll();
- if(index < d.length){
- return d[index];
- }else{
- return null;
- }
- }
- //求出链表的长度
- @Override
- public int length() {
- return this.len;
- }
- }
链表使用举例:
- package com.yyq;
- /**
- * Created by Administrator on 2015/9/4.
- */
- public class PrintListReversingly {
- public static void main(String[] args) {
- Link link = new LinkImpl();
- link.add("A");
- link.add("B");
- link.add("C");
- link.add(new String[]{"X","Y"});
- Object obj[] = link.getAll();
- for(Object o : obj){
- System.out.println(o);
- }
- System.out.println(obj.length);
- System.out.println(link.exists(null));
- System.out.println(link.get(3));
- link.delete("X");
- obj = link.getAll();
- for(Object o : obj){
- System.out.println(o);
- }
- System.out.println(obj.length); //注意这里还是原来obj开辟时的长度
- }
- }
从尾到头打印链表:
- package com.yyq;
- import java.util.Stack;
- /**
- * Created by Administrator on 2015/9/4.
- */
- public class PrintListReversingly {
- public static void main(String[] args) {
- Link link = new LinkImpl();
- link.add("A");
- link.add("B");
- link.add("C");
- link.add(new String[]{"D","E","F","G"});
- Object obj[] = link.getAll();
- for(Object o : obj){
- System.out.println(o);
- }
- int len = obj.length;
- System.out.println("============");
- for(int i = len-1; i >= 0; i--){
- System.out.println(obj[i]);
- }
- }
- }
P51、面试题5:从尾到头打印链表的更多相关文章
- 【剑指offer】面试题 6. 从尾到头打印链表
面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { i ...
- 剑指offer-面试题5.从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 刚看到这道题的小伙伴可能就会想,这还不简单,将链表反转输出. 但是这种情况破坏了链表的结构. 如果面试官要求不破坏链表结构呢,这时候我们 ...
- 前端常见算法面试题之 - 从尾到头打印链表[JavaScript解法]
题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值 实现思路 前端工程师看到这个题目,直接想到的就是,写个while循环来遍历链表,在循环中把节点的值存储在数组中,最后在把数组倒序后,遍 ...
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值 考察 单链表操作.栈.递归等概念. 理解:要实现单链表的输出,那么就须要遍历.遍历的顺序是从头到尾.而节点输出的顺序是从尾到头.因此,先 ...
- 《剑指offer》面试题5—从尾到头打印链表
重要思路: 这个问题肯定要遍历链表,遍历链表的顺序是从头到尾,而要输出的顺序却是从尾到头,典型的“后进先出”,可以用栈实现. 注意stl栈的使用,遍历stack的方法. #include <io ...
- 【剑指Offer】面试题06.从尾到头打印链表
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...
- 《剑指offer》面试题06. 从尾到头打印链表
问题描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10 ...
- 剑指Offer:面试题5——从尾到头打印链表(java实现)
问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; L ...
- 《剑指offer》面试题5 从尾到头打印链表 Java版
书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<Li ...
随机推荐
- (五)Qt5之中文显示
Qt中的中文显示,经常会出现乱码,但在UI设计界面上添加的中文是不会出现乱码的,如果你刚使用qt,那么你肯定会碰到这个问题. 网上搜索一下,找到的都是这种: #include < QTextCo ...
- Word中批量替换软回车
在平时工作中,有时候需要拷贝一些截取自网页上的文字,当选中后拷贝到Word中时,有时候在每行的结尾出现如下的符号,,这给后期文字的整理带来了很多不便,在此记录从网上获取的解决方法,以免遗忘和便于查找. ...
- Building microservices with Spring Cloud and Netflix OSS, part 2
In Part 1 we used core components in Spring Cloud and Netflix OSS, i.e. Eureka, Ribbon and Zuul, to ...
- Objective-C中class、Category、Block的介绍
@class 当定义一个类,必须为编译器提供两组消息,第一组(接口部分.h):构建类的实例的一个基本蓝图.必须指定类名,类的超类,类的实例变量和类型的列表,最后是类的方法的声明.第二组(实现部分.m) ...
- Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
- Linux进程间通信IPC学习笔记之管道
基础知识: 管道是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)没有名字: 2)用于共同祖先间的进程通信: 3)读写操作用read和write函数 #incl ...
- 在iframe结构中,如何使弹出层位于所有框架的上方(-)
在做后台管理页面的时候,经常用到iframe.虽说这东西有些过时,也不利于SEO,但是后台就是后台,不需要考虑那么多东西,综合来说,用iframe还是很适合后台管理界面的. 但是在遇到弹出层时,出现了 ...
- win 7 64位如何安装erdas 9.2
最主要的就是crack包必须包含这三个文件:erdas.exe、license.dat和lmgrd.exe 将这三个文件都复制到C盘安装目录下bin中,其余安装同win 7 32位系统
- XSS前端防火墙
前一段时间,在EtherDream大神的博客里看到关于XSS防火墙的一系列文章,觉得很有意思.刚好科创要做一个防火墙,就把XSS前端防火墙作为一个创新点,着手去实现了. 在实现过程中,由于各种原因,比 ...
- div蒙版+可移动
<html> <head> <title></title> <script src="jquery-1.8.2.js&q ...