您的位置:首页 > 职场人生

P51、面试题5:从尾到头打印链表

2015-10-26 11:03 393 查看
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

链表结点定义如下:

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]);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: