题目
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
思路
使用快慢指针
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
if (head == null) { //链表为空,返回空数组
return new int[0];
}
int index1 = 0,index2 = 0; //index1 表示头节点的下标(假设有,从0开始) index2 指向慢指针指向节点的下标()
int len = 0; //保存链表所需要的数组长度
ListNode f = head,s = head; //快慢指针,快指针f一次走两步,慢指针s一次走一步
while(f != null) { //指针移动
if(f.next == null) {
len = index2 * 2 + 1;
break;
}
if(f.next.next == null) {
len = index2 * 2 + 2;
break;
}
index2++;
f = f.next.next;
s = s.next;
}
f = head; //遍历结束,快指针指向头节点
int[] res = new int[len];
for(int i = len - index2 - 1; i >= 0;i--) { //将后半段链表倒序存入数组前半段
res[i] = s.val;
s = s.next;
}
for(int j = len - index1 - 1; j > index2;j--) { //将前半段链表倒序存入数组后半段
res[j] = f.val;
f = f.next;
}
return res;
}
}