方法一:逆转链表然后输出,设置三个指针pre,cur,next;
然后在next不为null的情况下循环:
1. cur的next指针指向pre元素
2. pre置为cur,cur置为next,next置为下一个元素;
3. 注意最后一次会少添加一个链表,因此需要加上。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
// 反转链表
ArrayList<Integer> list = new ArrayList<>();
if(listNode == null) return list; // 没有元素
if(listNode.next == null){
list.add(listNode.val);
return list; // 只有一个元素
}
ListNode pre = listNode,cur=pre.next,next=cur.next;
pre.next = null;
while(next != null){
cur.next = pre;
pre = cur;
cur = next;
next = next.next;
}
cur.next = pre; // 少执行一次,应添加
while(cur != null){
list.add(cur.val);
cur = cur.next;
}
return list;
} 方法二:
使用递归方法:
1. 递归终止条件为当前list结点的下一个结点为空;
2. 递归寻找当前结点的下一个结点,返回后将当前结点加入list中。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode == null) return list;
dfs(listNode,list);
return list;
}
void dfs(ListNode listNode, ArrayList<Integer> list){
if(listNode.next == null){
list.add(listNode.val);
}else {
dfs(listNode.next,list);
list.add(listNode.val);
}
} 方法三:先加入栈中,然后弹到list中,该方法比较简单因此略。

京公网安备 11010502036488号