自建单向链表,自建链栈,反向输出单向链表

题目:反向输出单向链表
解题思路:反向输出单向链表方法有很多,但笔者采用自建单向链表,自建链栈,将单向链表中元素输入栈中,再取出栈中元素,输入到新单向链表中
代码见下:

//自定义链表/链栈节点类
public class Node<T>{
    public Object  data;
    public Node next;
}
//自建单向链表
public class LinkList<T> {
    private static Node head=null;
    /**
     * 初始化
     */
    public void initLinkList(){
        head=new Node();
        head.data=null;
        head.next=null;
    }
    /**
     * 插入节点
     * @param element :节点元素值
     */
    public void insertLinkList(T element) {
        if (element == null) {
            throw new NullPointerException("参数不能为空");
        }
        Node node = new Node(); //生成节点
        node.data = element;
        if (head.next == null) {
            head.next = node;
            node.next = null;
        } else {
            Node temp = head;
            while (temp.next != null) {
                temp = temp.next;
            }
            temp.next = node;
            node.next = null;
        }
    }
    /**
     * 值删除
     *
     * @param element : 要删除的值
     * @return :删除则为true 否则为假
     */
    public boolean deleteLinkList(T element) {

        Node temp = head;
        if (temp.next == null) {
            System.out.println("链表已空,没有可删除的值");
            return false;
        }
        while (temp.next != null) {
            if (temp.next.data == element) {
                temp.next = temp.next.next;
                return true;
            } else {
                temp = temp.next;
            }
        }
        return false;
    }
    /**
     * 打印
     */
    public void printLinkList() {
        Node temp = head;
        System.out.print("打印单向链表: ");
        while (temp.next != null) {
            temp = temp.next;
            System.out.print(temp.data + " ");
        }
        System.out.println();
    }
    /**
     * 求长度
     *
     * @return : 返回的长度
     */
    public  int sizeLinkList() {
        Node temp = head;
        int size = 0;
        while (temp.next != null) {
            temp = temp.next;
            size++;
        }
        return size;
    }
    /**
     * 下标删除
     *
     * @param i : 要删除的值下标
     * @return :删除则为true 否则为假
     */
    public boolean deleteIndexLinkList(int i) {
        Node temp = head;
        int index = -1;
        if (temp.next == null) {
            System.out.println("链表为空,没有可删除的值");
            return false;
        }
        if (i < 0 || i >= sizeLinkList()) {
            System.out.println("下标越界");
            return false;
        }
        while (temp.next != null) {
            index++;
            if (index == i) {
                temp.next = temp.next.next;
                return true;
            }
            temp = temp.next;
        }
        return false;

    }
    /**
     * 给定值求下标
     *
     * @param element :要找的元素
     *  返回值 index 如果为-1 则没有找到
     */
    public int GetIndexByData(T element) {
        Node temp = head;
        int index = -1;
        if (temp.next ==null) {
            System.out.println("链表为空,无法查找!");
            return index;
        }
        while (temp.next != null) {
            temp = temp.next;
            index++;
            if (temp.data == element) {
                System.out.println("下标为: " + index);
                return index;
            }
        }
        System.out.println("要查找的值不存在!");
        return index;
    }
    /**
     * 给定下标求值
     * @param index
     */
    public Object getDataByIndex(int index) {
        Node temp = head;
        int size= 0;           //为增加下标用的
        if (temp.next == null) {
            System.out.println("链表为空,没有可查询的值!");
            return null;
        }
        if (index >= sizeLinkList() || index < 0){
            System.out.println("下标越界");
            return null;
        }

        while (temp.next !=null){
            temp = temp.next;
            if (size == index){
                return  temp.data;
            }
            size++;
        }
        return null;
    }
}

//自建链栈
public class LinkStack<T>  {
    private static Node top=null;
    /**
     * 初始化
     */
    public void initLinkStack(){
        top=new Node();
        top.data=null;
        top.next=null;
    }
    /**
     * 入栈,插入节点
     * @param element :节点元素值
     */
    public void pushLinkStack(T element) {
        if (element == null) {
            throw new NullPointerException("参数不能为空");
        }
        Node node = new Node(); //生成节点
        node.data = element;
        if (top == null) {
            top = node;
        } else {
            Node temp = top;
            top=node;
            node.next=temp;
        }
    }
    /**
     * 出栈,删除栈顶元素
     *
     * @param element : 要删除的值
     * @return :删除则为true 否则为假
     */
    public Object popLinkStack() {
        Object result;
        if (top == null) {
            System.out.println("链栈已空,没有可出栈的元素");
            return null;
        } else {
            result=top.data;
            top= top.next;
            return result;

        }
    }
    /**
     * 打印
     */
    public void printLinkStack() {
        Node temp = top;
        System.out.print("打印链栈表: ");
        while (temp.next != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }
    /**
     * 求链栈长度
     *
     * @return : 返回的长度
     */
    public  int sizeLinkStack() {
        Node temp = top;
        int size = 0;
        while (temp.next != null) {
            temp = temp.next;
            size++;
        }
        return size;
    }
}

//反向输出链表
public class AntitoneLinkList {
    public static void main(String[] args){
        //生成一个单向链表
        LinkList<Integer> linkList=new LinkList();
        //初始化
        linkList.initLinkList();
        //循环输入数字
        for (int i=1;i<=5;i++){
            linkList.insertLinkList(Integer.valueOf(i));
        }
        //生成一个栈
        LinkStack<Integer> linkStack=new LinkStack();
        //栈初始化
        linkStack.initLinkStack();
        //给栈赋值
        for (int j=0;j<5;j++){
            Integer integI=(Integer)linkList.getDataByIndex(j);
            linkStack.pushLinkStack(integI);
        }
        //打印原链表
        linkList.printLinkList();
        //打印栈
        linkStack.printLinkStack();

        //生成一个新的单向链表
        LinkList<Integer> linkListNew=new LinkList();
        //初始化
        linkListNew.initLinkList();
        //给新链表赋值
        int sizeStack=linkStack.sizeLinkStack();
        for(int k=0;k<sizeStack;k++){
            Integer intI=(Integer)linkStack.popLinkStack();
            linkListNew.insertLinkList(intI);
        }

        //打印新链表
        System.out.println("*****输出反向链表*****");
        linkListNew.printLinkList();

    }
}

输出:
在这里插入图片描述

发布了12 篇原创文章 · 获赞 0 · 访问量 3322

猜你喜欢

转载自blog.csdn.net/helloworldchina/article/details/104102329