链表倒序输出三种算法

来源:互联网 发布:linux 删除文件 api 编辑:程序博客网 时间:2024/06/05 17:56

输入一个链表,从尾到头打印链表每个节点的值。一共有三种方法,第一种方法为我自己的方法,另外两种参考其他人的,分别为利用栈和利用递归。

/***    public class ListNode {*        int val;*        ListNode next = null;**        ListNode(int val) {*            this.val = val;*        }*    }**/

第一种方法:

public static ArrayList<Integer> printTailToHead1(ListNode listNode)    {        //定义一个变量来累计链表的节点数        int num = 1;        ArrayList<Integer> a = new ArrayList<Integer>();        //累计节点数并将值加入集合        while(listNode != null)        {            a.add(listNode.val);            listNode = listNode.next;            num ++;        }        //头尾交换,讲集合里的节点倒序        for(int i = a.size() - 1,j = 0;i > j;j ++,i --)        {            int temp = a.get(i);            a.set(i, a.get(j));            a.set(j, temp);        }        return a;    }

方法2:利用栈

public static ArrayList<Integer> printTailToHead2(ListNode listNode)    {        //初始化一个栈,需要导入包java.util.stack        Stack<Integer> stack = new Stack<Integer>();        ArrayList<Integer> list = new ArrayList<Integer>();        //将节点一次加入到栈        while(listNode != null)        {            stack.add(listNode.val);            //讲节点后移            listNode = listNode.next;        }        //将节点从栈中取出,依次插入list        while(!stack.isEmpty())        {            list.add(stack.pop());        }        return list;    }

方法3:递归

public static ArrayList<Integer> printTailToHead2(ListNode listNode)    {        ArrayList<Integer> list = new ArrayList<Integer>();        //判断节点是否为空        if(listNode != null)        {            //判断下一个节点是否为空,为空则以下一个节点为参数递归            if(listNode.next != null)            {                list = printTailToHead2(listNode.next);            }            //最开始执行这条语句一定是最后一个节点            list.add(listNode.val);        }        return list;    }
0 0
原创粉丝点击