从尾到头打印一个链表

1、利用jdk的链表数据结构实现:

    /**
     *  问题7、从尾到头打印列表 用jdk的LinkList
     *
     */
    @Test
    public void print_reverse_LinkedList(){
        LinkedList<Person> list = new LinkedList<Person>();
        for (int i =5;i>0;i--){
            Person p1 = new Person();
            p1.setName("Alice"+i);
            p1.setAge(10+i);
            list.add(p1);
        }

        // 利用栈 实现逆序打印链表的内容
        Stack<Person> stack = new Stack<Person>();
        while (!list.isEmpty()){
            Person p2 = list.getFirst();
            list.removeFirst();
            stack.push(p2);
        }

        while (!stack.isEmpty()){
            Person p = stack.pop();
            System.out.println(p.toString());
        }

    }

2、自定义单链表,实现从尾到头打印链表

2.1数据结构的定义:

2.1.1链表的定义:

package com.itmei.offer;

/**
 * Created by qiaodan on 2017/12/8.
 */
public class MyLinkedList<T> {
    int size;
    MyLinkedListNode<T> head;
    MyLinkedListNode<T> rear;

    public MyLinkedListNode<T> getRear() {
        return rear;
    }

    public void setRear(MyLinkedListNode<T> rear) {
        this.rear = rear;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public MyLinkedListNode<T> getHead() {
        return head;
    }

    public void setHead(MyLinkedListNode<T> head) {
        this.head = head;
    }

    public MyLinkedList() {
        this.size = 0;
        this.head= null;
        this.rear = null;
    }

    public MyLinkedList add(T t){
        MyLinkedListNode<T> node = new MyLinkedListNode<>(t);
        if (this.head==null){
            this.head = node;
            this.size = 1;
            this.rear = node;
            return this;
        }else {
            this.rear.next = node;
            this.rear = node;
            this.size = this.size+1;
            return this;
        }
    }

    public boolean isEmpty(){
        if (this.size==0&&this.head==null) return true;
        else return false;
    }

    public T getFirst(){
        if (this.head!=null&&this.size>0)
            return this.head.getData();
        else return null;
    }

    public boolean removeFirst(){
        if (this.head.next==null){
            this.head =null;
            this.size =0;
            return true;
        }else {
            this.head =  this.head.next;
            this.size= this.size-1;
            return true;
        }
    }
}

2.1.2链表节点的定义:

package com.itmei.offer;

/**
 * Created by qiaodan on 2017/12/8.
 */
public class MyLinkedListNode<T> {
    T data;
    MyLinkedListNode<T> next;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public MyLinkedListNode<T> getNext() {
        return next;
    }

    public void setNext(MyLinkedListNode<T> next) {
        this.next = next;
    }

    public MyLinkedListNode(T data) {
        this.data = data;
        this.next = null;
    }

}

2.2 倒叙遍历的实现:

2.2.1实现的主方法:

    /**
     *  问题8、从尾到头打印列表 自定义的MyLinkList 有next指针 可以直接用递归的方式来打印链表
     *
     */
    @Test
    public void print_reverse_MyLinkedList() {
        MyLinkedList<Person> list = new MyLinkedList<>();
        for (int i = 5; i > 0; i--) {
            Person p1 = new Person();
            p1.setName("Alice" + i);
            p1.setAge(10 + i);
            list.add(p1);
        }

        // 利用递归来打印
        if (list==null){
            System.out.println("链表为空!");
        }else {
            print_reverse_MyLinkedList(list.head);
        }

    }

2.2.2实现的核心递归方法:

    // 递归动作 这里还有一个问题 为什么没有按照预期 倒叙打印 反而只打印了链表的尾部 一个else的区别 递归打印下面的元素之后 回来要打印自己!
    public void print_reverse_MyLinkedList(MyLinkedListNode head){
        if (head.next!=null)
            this.print_reverse_MyLinkedList(head.next);
         System.out.println(head.getData().toString());
    }
时间: 2024-10-21 15:50:02

从尾到头打印一个链表的相关文章

06 从尾到头打印新链表

题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: 1)使用list容器:顺序访问链表,使用push_front()将元素插入list容器的前方. 2)使用栈 3)使用递归函数:递归在本质上是一个栈结构 4)用反向迭代器(object.rbegin(), object.rend()) 5)头插法(复杂度高) 测试用例: 1)功能测试:(输入的链表有多个节点:只有一个节点) 2)特殊输入测试:(输入的链表头节点指针为nullptr) 代码: 1)使用list容

输入一个链表,从尾到头打印链表每个节点的值

题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 用栈处理: /** *    public class ListNode { *        int val; *        ListNode next = null; * *        ListNode(int val) { *            this.val = val; *        } *    } * */ import 

《剑指Offer》题目——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值. 题目分析:用栈:Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack public class ReverseList { class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val

从尾到头打印链表

参与人数:4164时间限制:1秒空间限制:32768K 通过比例:16.80% 最佳记录:0 ms|0K(来自  黄昏的足迹) 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 提交时间:2015-09-25 语言:C++ 运行时间:0ms 占用内存:8552K 状态:答案正确 /* 遍历一次链表,每遍历到一个结点,就将结点的值插入到vecotr的开始. */ /** * struct ListNode { * int val; * struct ListNode *next; * Lis

5-从尾到头打印链表

题目描述:http://ac.jobdu.com/problem.php?pid=1511 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 逆序打印链表,我们遍历链表只能从头到尾,现在要求我们从尾到头.后进先出,可以想到用

九度oj题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:6010 解决:1805 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出

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

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ function printListFromTailToHead(head) { var res=[]; while(head){ res.unshift(head.val); head=head.next; } return res; } 相关知识 创建一个链表,并实现插入,删除,添加的方法

从尾到头打印链表-剑指Offer

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值 输入描述 输入为链表的表头 输出描述 输出为需要打印的“新链表”的表头 思路 单向链表是从头到尾指向的,从尾到头打印符合“后进先出”,所以我们使用栈结构Stack 代码 import java.util.ArrayList; import java.util.Stack; public class Solution03 { public ArrayList<Integer> printListFromTailToHead(

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis