题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

链表结点定义如下:

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:从尾到头打印链表的更多相关文章

  1. 【剑指offer】面试题 6. 从尾到头打印链表

    面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { i ...

  2. 剑指offer-面试题5.从尾到头打印链表

    题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 刚看到这道题的小伙伴可能就会想,这还不简单,将链表反转输出. 但是这种情况破坏了链表的结构. 如果面试官要求不破坏链表结构呢,这时候我们 ...

  3. 前端常见算法面试题之 - 从尾到头打印链表[JavaScript解法]

    题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值 实现思路 前端工程师看到这个题目,直接想到的就是,写个while循环来遍历链表,在循环中把节点的值存储在数组中,最后在把数组倒序后,遍 ...

  4. 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)

    题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值 考察 单链表操作.栈.递归等概念. 理解:要实现单链表的输出,那么就须要遍历.遍历的顺序是从头到尾.而节点输出的顺序是从尾到头.因此,先 ...

  5. 《剑指offer》面试题5—从尾到头打印链表

    重要思路: 这个问题肯定要遍历链表,遍历链表的顺序是从头到尾,而要输出的顺序却是从尾到头,典型的“后进先出”,可以用栈实现. 注意stl栈的使用,遍历stack的方法. #include <io ...

  6. 【剑指Offer】面试题06.从尾到头打印链表

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...

  7. 《剑指offer》面试题06. 从尾到头打印链表

    问题描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10 ...

  8. 剑指Offer:面试题5——从尾到头打印链表(java实现)

    问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; L ...

  9. 《剑指offer》面试题5 从尾到头打印链表 Java版

    书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<Li ...

随机推荐

  1. 《Web编程入门经典》

    在我还不知道网页的基础结构的时候,我找过很多本介绍Web基础的书籍,其中这本<Web编程入门经典>,我认为是最好的. 这本书内容很全面.逻辑很严谨.结构很清晰.语言文字浅显易懂. 看这本书 ...

  2. Check Big/Little Endian

    Little endian:Low memory address stores low byte value.(eg.  short int 0x2211   0xbfd05c0e->0x11 ...

  3. KnockoutJS(3)-绑定语法

    绑定语法大致分为2种: 1. 数据绑定(data-bind syntax) 2. 绑定上下文(Binding Context) 下面针对这2中绑定语法分别介绍一下 1. 绑定上下文(Binding C ...

  4. discuz论坛X3升级时 文件下载出现问题,请查看您的服务器网络以及data目录是否有写权限

    discuz论坛2.5升级X3时候, 在线升级一半提示: 文件 static/image/postbg/3.jpg 下载出现问题,请查看您的服务器网络以及data目录是否有写权限,请确认无误后点击确定 ...

  5. HTML5 Video(视频)

    HTML5 Video(视频) 很多站点都会使用到视频. HTML5 提供了展示视频的标准. 检测您的浏览器是否支持 HTML5 视频: 检测 Web站点上的视频 直到现在,仍然不存在一项旨在网页上显 ...

  6. linux下挂载移动硬盘ntfs格式

    http://jingyan.baidu.com/article/f96699bba93dce894e3c1bec.html fdisk -l安装后 使用命令mount -t ntfs-3g /dev ...

  7. NoSQL专家王涛访谈:为什么我们还要做一个NoSQL?

    ChinaUnix:各位网友大家好,今天有幸请到王涛先生到CU做客,与大家交流一些工作经验.首先请王涛先介绍一下自己. 王涛:大家好,我是王涛.过去八年里我一直在IBM多伦多实验室从事DB2引擎研发的 ...

  8. VB 核心编程及通用模块开发 笔记1

    前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...

  9. WPF简单的口算案例

    前几天在博客园,看到有博友利用Winform做了一个口算案例,于是我想把它移植在WPF程序中.Winform程序:http://www.cnblogs.com/ImYZF/p/3345452.html ...

  10. 【BZOJ 1053】[HAOI2007]反素数ant

    Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1 ...