剑指 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) {
    Stack stack = 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(len
    1){
    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.next
    null){
    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.next
    null){
    // 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 List list = 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);
    }
    }

解法五:先将栈的值按从头到尾的顺序存入一个数组,再将数组反转

posted @ 2020-11-08 20:02  for_ward  阅读(45)  评论(0)    收藏  举报