力扣刷题剑指offer06——从尾到头打印链表

题目:

        输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例:

输入:head = [1,3,2]
输出:[2,3,1]

方法1---链表转数组,然后反转

思路:

        可以先将链表转为数组,然后用双指针的方法反转数组

代码:

class Solution {
public:
    vector reversePrint(ListNode* head) {
        ListNode *p=head;
        vector vec;
        while(p){//链表转数组
            vec.push_back(p->val);
            p=p->next;
        }
        int i=0;
        int j=vec.size()-1;
        while(i<=j){//双指针反转数组
            swap(vec[i],vec[j]);
            i++;
            j--;
        }
        return vec;
    }
};

时间复杂度:O(n),n表示链表节点的个数

空间复杂度:O(n),链表节点个数

方法2--先反转链表,然后转数组

解题思路:

        我们先要反转链表,由于是单链表,所以要在之前存储其前一个节点,所以我们用双指针的做法,新建两个节点p和pre,p指向head,pre表示p的前一个节点,在遍历链表的过程中,由于我们要改变p->nexts使其指向的是其前一个节点,所以在遍历链表的过程中,我们需要新建一个节点next来记录p->next,然后改变p->next=pre,再让p和pre后移。

力扣刷题剑指offer06——从尾到头打印链表_第1张图片

        链表反转后,我们再将链表转为数组

代码:

class Solution {
public:
    vector reversePrint(ListNode* head) {
        ListNode *p=head;
        ListNode *pre=nullptr;
        while(p){
            ListNode *next=p->next;//用来记录p的后一个节点,不然改变p->next后就会找不到p后面的节点
            p->next=pre;//改变链表方向
            pre=p;//pre随p后移
            p=next;//继续遍历原链表
        }
        vectorvec;
        while(pre){//链表转数组
            vec.push_back(pre->val);
            pre=pre->next;
        }
        return vec;
    }
};

时间复杂度:O(n),n表示链表节点的个数

空间复杂度:O(n),链表节点个数

 

你可能感兴趣的:(力扣刷题笔记——链表,链表,leetcode,数据结构)