链表必刷题
从尾到头打印链表
题目描述
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例:输入:head = [1,3,2]
输出:[2,3,1]
链接:从尾到头打印链表
方法一:反转链表遍历
思路1:使用数组,首先遍历链表求出链表长度,然后从尾到头将元素放入数组中,输出数组.
public int[] reversePrint(ListNode head) {
ListNode cur=head;
int count=0;
while(cur!=null) {
count++;
cur=cur.next;
}
int arr[]=new int[count];
cur=head;
for(int i=count-1;i>=0;i--) {
arr[i]=cur.val;
cur=cur.next;
}
return arr;
}
方法二:栈
思路2:首先遍历链表,遍历的链表是从头到尾,可输出的顺序却是从尾到头.也就是说,第一个遍历到的节点最后一个输出,而最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,我们可以用栈实现这种顺序。每经过一个节点的时候,把该节点发到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出节点,此时输出的节点顺序已经反转过来了.
public int[] reversePrint(ListNode head) {
ListNode cur=head;
Stack<ListNode> stack=new Stack<>();
int count=0;
//将元素放入栈中
while (cur!=null) {
stack.push(cur);
count++;
cur=cur.next;
}
int[] arr=new int[count];
int i=0;
//出栈
while (!stack.empty()) {
ListNode pNode=stack.peek();
arr[i++]=pNode.val;
stack.pop();
}
return arr;
}
方法三:递归
思路3:既然可以想到用栈来实现,而递归的本质上就是一个栈结构,于是又想到了用递归来实现。要实现反过来输出链表,我们每访问到一个节点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了.
ArrayList<Integer> list=new ArrayList<>();
public int[] reversePrint(ListNode head) {