剑指offer——6.从头到尾打印链表的三种解法

目录

方法一:修改链表结构,将节点的指针反转

方法二: 栈/reverse

方法三:递归


方法一:修改链表结构,将节点的指针反转

  • 一般打印操作不要修改原结构,抛弃此方法

方法二: 栈/reverse

  • 这种先入后出的结构当然会想到栈stack
  • 此处要返回vector,所以用C++库函数reverse更方便
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> v;
        while(head!=NULL){
            v.push_back(head->val);
            head = head->next;
        }
        reverse(v.begin(),v.end());
        return v;
    }
};

方法三:递归

  • 不推荐使用,递归过深会挂掉
  • 比如在牛客上会出现段错误
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
private:
    vector<int> v;
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> v;
        fun(head);
        return v;
    }
    void fun(ListNode* head){
        if(head->next==NULL)
            return;
        fun(head->next);
        v.push_back(head->val);
    }
};

发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104849211