Q3--从尾到头打印链表

来源:互联网 发布:sopcast网络电视 apk 编辑:程序博客网 时间:2024/05/29 11:20

一、题目描述

输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

二、解题思路

如果只是从尾到头打印链表不需要将链表反转,可以采用下面的方法1和方法2来实现。方法1是用递归的解法,方法2是用栈,方法3则是将链表反转。

三、代码实现

import java.util.ArrayList;import java.util.Stack;class ListNode{    int val;    ListNode next = null;    ListNode(int val){        this.val = val;    }}public class Main {    public static void main(String[] args){        //构造一个单向链表        ListNode head = new ListNode(8);        ListNode p = head;        for(int i = 0; i < 5; i++){                     ListNode ln = new ListNode(i);                      p.next = ln;            p = p.next;        }        //采用第一种方法返回反序后的列表        ArrayList<Integer> al = printListFromTailToHead(head);        System.out.println(al);        //采用第二种方法返回反序后的列表        ArrayList<Integer> al2 = printListFromTailToHead2(head);        System.out.println(al2);        //用三个指针来得到反序后的头指针,并依次输出链表各元素的值        ListNode newHead = printListFromTailToHead3(head);        while(newHead != null){            System.out.print(newHead.val);            newHead = newHead.next;        }    }    //第一种方法:用栈来实现    public static ArrayList<Integer> printListFromTailToHead(ListNode head){        ArrayList<Integer> al = new ArrayList<Integer>();        Stack<Integer> sta = new Stack<Integer>();        while(head != null){            sta.add(head.val);            head = head.next;        }               while(!sta.empty())            al.add(sta.pop());              return al;    }    public static ArrayList<Integer> printListFromTailToHead2(ListNode head){        ArrayList<Integer> al = new ArrayList<Integer>();        if(head != null){            if(head.next != null)                al.addAll(printListFromTailToHead2(head.next));        al.add(head.val);        }        return al;    }    //用三个指针来实现链表的反序,返回的是头指针    public static ListNode printListFromTailToHead3(ListNode head){        if(head == null) return null;        ListNode node1 = head;        if(node1.next == null) return head;        ListNode node2 = node1.next;        node1.next = null;        if(node2.next == null)        {            node2.next = node1;            return node2;        }        ListNode node3 = node2.next;        node2.next = node1;        while(node3.next != null){            node1 = node2;            node2 = node3;            node3 = node3.next;            node2.next = node1;                             }           node3.next = node2;        return node3;    }}
0 0
原创粉丝点击