剑指offer系列之一:从尾到头打印链表

题目描述: 
给定一个链表,从尾部到头部打印输出链表结点的值。看到这个题目我的基本思路是:首先遍历一遍链表,统计出结点的个数,然后进行第二次遍历把每次访问的结点的值方到一个临时数组中,遍历结束之后,该临时数组中的值与正向遍历链表的值的顺序是一样的。那么在第三次遍历的时候,把上面的临时数组拷贝到另外一个临时数组中,只不过这次拷贝是从最后一个位置的值开始拷贝的,这样第三次遍历结束之后,第二个临时数组中的值的顺序就是从尾到头遍历链表的值的顺序了。最后一次遍历就是把第二个临时数组转化为一个ArrayList对象,并返回。

已知如下条件:

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

Java算法实现:

public class test25 {
	public ArrayList<Integer> traversingList(ListNode listNode){
		//设一个结点指向第一个结点(无头结点)
		ListNode temp = listNode;
		int len = 0,i=0;
		//遍历链表求结点个数
		while(listNode!= null) {
			++len;
			listNode = listNode.next;
		}
		//把结点元素依次填入数组
		Integer[] a = new Integer[len];
		while(temp != null){
			a[i++] = temp.val;
			temp = temp.next;
		}
		//倒序填入另一个数组
		Integer[] b = new Integer[len];
		for(int j=0; j<a.length; j++){
			b[len -1 -j] = a[j];
		}
		
		//依次存入ArrayList数组
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		for(int j=0 ;j<a.length; j++){
			arrayList.add(j,b[j]);
		}
		return arrayList;
	}
	
	
	public static void main(String[] args) {
		ListNode node0 = new ListNode(1);
		ListNode node1 = new ListNode(2);
		ListNode node2 = new ListNode(3);
		ListNode node3 = new ListNode(4);
		
		node0.next = node1;
		node1.next = node2;
		node2.next = node3;
		node3.next = null;
		
	    ArrayList<Integer> list = new test25().traversingList(node0);
	    for(Integer in : list) {
	    	System.out.println(in);
	    }
	}	
}

时间复杂度为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值