码迷,mamicode.com
首页 > 其他好文 > 详细

[剑指Offer] 从尾到头打印链表

时间:2020-05-24 00:20:59      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:nod   ack   数据   array   数组   reverse   pop   stack   时空   

问题描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

分析

链表只能顺序访问,但要求逆序地返回链表中的元素

  1. 遍历链表存到临时空间(栈或数组都行),再逆序输出到最终结果
  2. 反转链表,遍历链表到最终结果

临时空间

遍历链表,将数据插入栈,逆向遍历临时空间,将数据插入最终结果数组

C++版

// 使用vector作为临时空间
vector<int> printListFromTailToHead(ListNode* head) {
    vector<int> tmp;
    vector<int> result;
    if (head == NULL) return result;
    ListNode* tmpHead = head;
    while (tmpHead != NULL) {
        tmp.push_back(tmpHead->val);
        tmpHead = tmpHead->next;
    }

    int len = tmp.size();
    for(int i = len - 1; i >=0; --i) {
        result.push_back(tmp[i]);
    }

    return result;
}

// 使用stack作为临时空间
vector<int> printListFromTailToHead(ListNode* head) {
    stack<int> tmp;
    vector<int> result;
    if (head == NULL) return result;
    ListNode* tmpHead = head;
    while (tmpHead != NULL) {
        tmp.push(tmpHead->val);
        tmpHead = tmpHead->next;
    }

    while (!tmp.empty()) {
        result.push_back(tmp.top());
        tmp.pop();
    }
    return result;
}

Java版

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> tmp = new ArrayList<Integer>();
    ArrayList<Integer> result = new ArrayList<Integer>();
    while (listNode != null) {
        tmp.add(listNode.val);
        listNode = listNode.next;
    }
    int len = tmp.size();
    for(int i = len-1; i >= 0; --i) {
        result.add(tmp.get(i));
    }

    return result;
}

反转单链表

先reverse单链表,再遍历单链表,将数据插入最终结果

vector<int> printListFromTailToHead(ListNode* head) {
    if (head == NULL || head->next == NULL) return {};
    ListNode* p = head;
    ListNode* q = head->next;
    ListNode* r = q->next;
    p->next = NULL; // 重要,无此步则单链表出现环
    while (r != NULL) {
        q->next = p;
        p = q;
        q = r;
        r = r->next;
    }

    q->next = p;
    head = q;

    vector<int> result;
    while (head != NULL) {
        result.push_back(head->val);
        head = head->next;
    }

    return result;
}

[剑指Offer] 从尾到头打印链表

标签:nod   ack   数据   array   数组   reverse   pop   stack   时空   

原文地址:https://www.cnblogs.com/arcsinw/p/12945004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!