Sword06——从尾到头打印链表
方法1——辅助栈
- 思路:因为要将所有节点都返回,所以必定使用到相关数据结构进行存储;又因为是结果顺序是要逆序,则可以使用栈进行存储相关结果,最后遍历栈得出结果
- 特殊情况与临界分析:链表长度可能为0,需要判断其长度
- 终止条件:链表遍历到尾部时,从栈中取出所有元素
- 步骤:
- 链表非空校验和长度校验(由于while循环处判断为当前节点非空,因此可省略)
- 定义一个栈,用于存放遍历结果
- 定义一个移动节点
- 循环终止条件:当前节点不为空
- while循环
- 取出栈的大小为size
- 根据栈的大小构造结果数组
- 循环终止条件:栈不为空
- while循环更改为for循环,可以利用i作为数组下标
- 注意点:此处for循环的判断不能取stack.size(),因为会弹出元素后栈将发生变化
- 返回结果数组
public int[] reversePrint(ListNode head) {
Deque<Integer> stack = new LinkedList<>();
ListNode cur = head;
while (cur != null) {
stack.push(cur.val);
cur = cur.next;
}
int size = stack.size();
int[] res = new int[size];
for (int i = 0; i < size; i++) {
res[i] = stack.pop();
}
return res;
}
![方法1——辅助栈](https://i-blog.csdnimg.cn/blog_migrate/d545129f4e18808f8f0fa8f83ae3dd83.png)
方法2——递归
- 思路:依次遍历下一个节点,当自身节点为空时,依次向上返回结果
- 特殊情况与临界分析:链表长度可能为0,需要判断其长度
- 终止条件:最后一个节点自身为空时,证明已到链表末尾
- 步骤:
- 定义全局结果数组
- 定义记录链表长度,便于初始化数组
- 定义记录结果数组中正在填充的位置
- 链表非空校验和长度校验(由于递归方法中有判断为当前节点非空,因此可省略)
- 开启递归
- 返回结果数组
- 递归方法
- 当前节点为空
- 当前节点非空(注意此处的顺序)
- 链表长度加1
- 向下继续递归
- 将自身值加入数组中
- 数组位置索引加1
int[] res;
int length = 0;
int index = 0;
public int[] reversePrint(ListNode head) {
reverse(head);
return res;
}
private void reverse(ListNode head) {
if (head == null) {
res = new int[length];
return;
}
length++;
reverse(head.next);
res[index] = head.val;
index++;
}
![方法2——递归](https://i-blog.csdnimg.cn/blog_migrate/131b8bf66140c52630faf3c9dc044dfa.png)