剑指 Offer 06. 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
解法一:借助栈
思路:栈的特点是先进后出,java有stack类
代码:
/**
- Definition for singly-linked list.
- public class ListNode {
-
int val; -
ListNode next; -
ListNode(int x) { val = x; } - }
*/
class Solution {
public int[] reversePrint(ListNode head) {
Stackstack = new Stack ();
ListNode p = head;
int len = 0;
while(p!=null){
stack.push(p);
p = p.next;
len++;
}
if(len0){
return new int[0];
}
if(len1){
return new int[]{head.val};
}
int[] ret = new int[len];
int i = 0;
while(!stack.empty()){
ret[i++]=stack.pop().val;
}
return ret;
}
}
分析:时间复杂度为O(n),由于开辟了栈,空间复杂度为O(n)
解法二:三指针反转链表
代码:
/**
- 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(headnull){
return new int[0];
}
if(head.nextnull){
return new int[]{head.val};
}
ListNode p = head;
ListNode q = p.next;
ListNode i = q.next;
int len = 1;
p.next = null;
while (q!=null){
q.next = p;
p =q ;
q =i;
if(i!=null){
i = i.next;
}
len++;
}
int[] result = new int[len];
int j = 0;
while(p!=null){
result[j] = p.val;
p = p.next;
j++;
}
return result;
}
}
分析:不需要额外的空间,时间复杂度为O(n)
解法三:递归反转链表
代码:
/**
-
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(headnull){
return new int[0];
}
// if(head.nextnull){
// return new int[]{head.val};
// }
ListNode p = head;
int len = 0;
while(p!=null){
len++;
p = p.next;
}
int[] result = new int[len];
p = head;
ListNode q = p.next;head = solve(p,q); //以q为表头的链表指向p for (int i = 0; i < len; i++) { result[i] = head.val; head = head.next; } return result;}
public static ListNode solve(ListNode p ,ListNode q){
if(q==null){
return p;
}
ListNode i = q.next;
q.next = p;
return solve(q,i);
}
}
解法四:递归将val加入列表
代码:
/**
-
Definition for singly-linked list.
-
public class ListNode {
-
int val; -
ListNode next; -
ListNode(int x) { val = x; } -
}
*/
class Solution {
static Listlist = new ArrayList();
public int[] reversePrint(ListNode head) {
if(head==null){
return new int[0];
}
list.clear();
solve(head);
int[] result = new int[list.size()];
for (int i = 0; i < result.length; i++) {
result[i] = list.get(i);
}
return result;
}public static void solve(ListNode head){
if(head==null){
return;
}
solve(head.next);
list.add(head.val);
}
}
解法五:先将栈的值按从头到尾的顺序存入一个数组,再将数组反转

浙公网安备 33010602011771号