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