zoukankan      html  css  js  c++  java
  • 从尾到头打印一个链表

    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());
        }
    
  • 相关阅读:
    loj #143. 质数判定
    Quadratic Residues POJ
    P2155 [SDOI2008]沙拉公主的困惑
    P3868 [TJOI2009]猜数字
    P3704 [SDOI2017]数字表格
    P4449 于神之怒加强版
    P2568 GCD
    P1891 疯狂LCM
    loj#6229 这是一道简单的数学题
    P3768 简单的数学题 杜教筛+推式子
  • 原文地址:https://www.cnblogs.com/Jordandan/p/8006665.html
Copyright © 2011-2022 走看看