倒序输出链表

1 思路:先遍历链表,用一个数组存储链表的值。然后反转该数组,返回该数组即可。
2 核心模块
①遍历链表
我的误区:head是虚拟头结点,不存放有意义的链表数据。
按照题目意思:head中存放链表的第一个数据。
遍历链表:定义指向ListNode类型的指针p,使其指向头结点。仅当p不为空的时候,将p的数据域存入数组,并且将p指向下一个节点。最后返回数组。对应代码:

ListNode * p=head;
 while(p!=NULL) 
        {
            Ldata.push_back(p->val);
            p=p->next;
            
        }

极端情况说明:如果传入的链表为空,则不进行任何操作,直接返回数组。因为数组仅声明,所以输出为空。

②反转数组
反转数组有三种实现方式:
方式一:自定义实现反转,注意千万不要在数组本身上反转,会覆盖会出错,再定义一个新的数组,将反转后的结果存入新数组。

for(int i=0;i<Ldata.size();i++)
   res.push_back(Ldata[Ldata.size()-1-i]);
  return res;

方式二:使用algorithm中的reverse()函数,注意reverse函数传入的参数

reverse(Ldata.begin(),Ldata.end());
 return Ldata;

方式三:使用vector中的反转迭代器

vector <int> ::reverse_iterator rit=Ldata.rbegin();
 for(;rit!=Ldata.rend();rit++)
       res.push_back(*rit);
 return res;

3 完整代码

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector <int> Ldata,res;
        
        ListNode * p=head;
       
        while(p!=NULL) //对于头指针的理解有问题,头指针也可以存放链表的有效数据
        {
            Ldata.push_back(p->val);
            p=p->next;
            
        }
        
        //法一:自定义自己实现反转的时候千万不要在数组本身上反转,会覆盖会出错
        //for(int i=0;i<Ldata.size();i++)
          // res.push_back(Ldata[Ldata.size()-1-i]);
        // return res;
        //法二:使用algorithm中的reverse()函数
       //reverse(Ldata.begin(),Ldata.end());
         // return Ldata;
         //法三:使用vector中的反转迭代器
        vector <int> ::reverse_iterator rit=Ldata.rbegin();
        for(;rit!=Ldata.rend();rit++)
            res.push_back(*rit);
         return res;
    }
};

4 收获:
在线编程题如果只有一部分通过率,不一定是没考虑到边界情况,还有可能是逻辑上存在错误。

猜你喜欢

转载自blog.csdn.net/weixin_43854189/article/details/89790505
今日推荐