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());
        }
    
  • 相关阅读:
    Serialize and Deserialize Binary Tree
    sliding window substring problem汇总贴
    10. Regular Expression Matching
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接
    程序员如何写一份合格的简历?(附简历模版)
    9个提高代码运行效率的小技巧你知道几个?
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构
    24张图7000字详解计算机中的高速缓存
    《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第五章 优化程序性能
  • 原文地址:https://www.cnblogs.com/Jordandan/p/8006665.html
Copyright © 2011-2022 走看看