面试题6: 从尾到头打印链表

题目描述

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

第二轮:思想

  • 方法一:递归实现
  1. 用到vector作为存放数组元素的容器
  2. 用到引用,使代码的实现过程只用到一个vector容器
    1. 如果不使用引用&,则结果出不来,但是可以打印输出值
    image.png

    2. 使用引用&,再次打印每次遍历过程中vector容器的值为:
    image.png

    结论: 引用&会使每一轮的vector都指向同一个容器,这样有利于结果的输出,若不用引用&会使每一轮的结果存入不同的容器内,结果输不出来。
class Solution {
public:
    vector printListFromTailToHead(ListNode* head) {
        vector result;
        if(head == NULL){
            return result;
        }
        
        recur(result, head);
        return result;
    }
    
 void printV(vector& v)
{
      for(int i=0;i& result, ListNode* temp){
        if (temp != NULL){
            recur(result ,temp->next);
            result.push_back(temp->val);//可以输出数组中的值
            printV(result);
        }
        result.push_back(temp->val);
    }
};

第一轮:思想

方法一:利用vector动态分配数组

利用数组方法。选用C++中的vector类,并利用push_back函数在vector尾部依次加入数据。
问题:

  1. 因为temp[++length]是先执行temp[length]再执行length++的,所以length是多加了一位从1到10共十一位数。利用push_back函数时从bb[0]开始,即在动态数据bb中加入十一位数。在主函数输出时,obj.size()=11,不要第一个元素即obj[0]元素,输出十个数。
vector aa(ListNode *head)
{
    vector bb;
    int temp[100],length=0;
    ListNode *p;
    p = head;
    while(p!=NULL)
    {
        temp[++length] = p->val;
        p = p->next;
    }
    //cout< obj;
    //尾插法建立链表
    head = tail = NULL;
    for(i = 0;i<10;i++)
    {
        p = new ListNode;
        p->val = i;
        p->next = NULL;
        
        if(head==NULL)
        {
            head = p;
        }
        else
        {
            tail->next = p;
        }
        tail = p;
    } 
    
    p = head;
    while(p != NULL)
    {
        cout<val<<" ";
        p = p->next;
    }
    cout<0;i--)
        {
            cout<
方法二:利用递归
#include
#include
using namespace std;

struct ListNode{
    int val;
    struct ListNode *next;
};

void aa(ListNode *head)
{
    if(head!=NULL)
    {
        aa(head->next);
        cout<val<<" ";
    }
}

int main()
{
    ListNode *p,*tail,*head;
    int i;
    //vector obj;
    //尾插法建立链表
    head = tail = NULL;
    for(i = 0;i<10;i++)
    {
        p = new ListNode;
        p->val = i;
        p->next = NULL;
        
        if(head==NULL)
        {
            head = p;
        }
        else
        {
            tail->next = p;
        }
        tail = p;
    } 
    
    p = head;
    while(p != NULL)
    {
        cout<val<<" ";
        p = p->next;
    }
    cout<
方法三:利用栈

栈的特性是先进后出

#include
#include
using namespace std;
/*
stack就是栈,是一种后进先出的元素序列 
stack intstack 是int类型的栈 
*/
struct ListNode{
    int val;
    struct ListNode *next;
};

void aa(ListNode *head){
    stack node; //结点指针类型的栈 
    ListNode *p;

    p = head;
    while(p != NULL){
        node.push(p);    //在栈顶增加元素
        p = p->next;
    }

    while(!node.empty()){
        p = node.top();  //返回栈顶元素
        cout<val<<" ";
        node.pop();      //移除栈顶元素
    }
    cout<val = i;

        if(head == NULL){
            head = p;
        }
        else{
            tail->next = p;
        }
        tail = p;
    }
    aa(head);
}

你可能感兴趣的:(面试题6: 从尾到头打印链表)