题目详情
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
题目分解/做题思路
题目让将链表从尾到头反过来输出每个结果的值,其实就是反转链表
解题方法01 - 栈
因为栈是先进后出的,可以使用栈来存储这个链表,然后出栈,栈顶的元素就是链表末尾的元素
1、将链表循环放入栈中
2、使用数组接收出栈的元素
解题步骤
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
//反转链表
public int[] reversePrint(ListNode head) {
//栈,先进后出
Stack<ListNode> stack = new Stack<>();
ListNode temp = head;
//入栈
while (temp != null){
stack.push(temp);
temp = temp.next;
}
int size = stack.size();
int[] res = new int[size];
for (int i = 0; i < size; i++) {
res[i] =stack.pop().val;//获取栈中弹出的元素的值
}
return res;
}
解题方法02-双指针
使用双指针实现链表反转
指针1指向前一个节点,指针2指向当前节点,指针3位为临时指针,存储当前节点的下一个节点。
使用计数器记录节点数,然后创建数组,遍历反转后的链表,存入数组
解题步骤
//方法二:双指针
ListNode prev = null; //前一个指针
ListNode curr = head; //当前的指针
int count = 0;
//反转链表
while (curr != null){//判断是否结束
ListNode temp = curr.next; //定义一个临时节点,用来存储当前节点的下一个节点
curr.next = prev; //让当前节点的next指针指向前一个节点 (让当前节点的下个节点指向当前节点),实现反转链表
prev = curr;//将当前节点 curr 赋值给 prev ,即将前一个节点指针更新为当前节点,向后挪一位
curr = temp;// 将下一个节点赋值给curr,即将当前节点指针更新为下一个节点,将当前节点移动到下一个节点的位置,以便进行下一次反转。
count++;
}
int[] result = new int[count];//定义一个数组
int index = 0;
//将节点存储到数组
while (prev != null){
result[index++] = prev.val;
prev = prev.next;
}
return result;
相关标签:反转链表 栈 双指针