面试题6: 从尾到头打印链表(数组引用和指针)

题目描述

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

前期准备工作

  • 生成链表
ListNode*  createList()
{
    ListNode *head = NULL;
    ListNode *tail = NULL;
    for(int i = 0; i < 10 ; ++i)
    {
        ListNode *p = new ListNode ;
        p->val = i;
        p->next = NULL;
        if(!head)
        {
            head = p;
            tail = head;
        }
        else
        {
            tail->next = p;
        }
        tail = p;
    }
    return head;
}
  • 输出链表
void printList(ListNode *head)
{
    ListNode *p = NULL;
    p = head;
    while(p)
    {
        cout << p->val << " " ;
        p = p->next;
    }
    cout<<endl;
}

解题思路

  • 使用普通数组做函数参数,在子函数中采用递归修改数组元素值
    注意点:此处,我们让数组的索引进行无返回值的变化,故设置为指针类型。实参用&传递地址,形参用*修改内存值
void arr_To_list_rever(int arr[],ListNode *head,int *index)
{
    if(head)
    {
        arr_To_list_rever(arr,head->next,index);
        arr[*index] = head->val; //
        ++ (*index);//
    }
    else
    {
        //什么都不做
    }
}

void printArr(int arr[],int *index)
{
    if(index == 0)
    {
        cout << "链表为空" << endl;
    }
    else
    {
        for(int i = 0; i<index; ++i)
        {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
}

int main()
{
    ListNode *head;
    head = createList();
    printList(head);
    int index = 0;
    int arr[20] = {0};
    arr_to_list_rever(arr ,head , &index);
    printArr(arr , &index);
}
  • 对数组索引使用引用操作
    引用只是变量的别名
void arr_to_list_rever(int arr[],ListNode *head,int &index)
{
    if(head)
    {
        arr_to_list_rever(arr,head->next,index);
        arr[index] = head->val;
        ++index;
    }
}

void printArr(int arr[],int &index)
{
    if(index == 0)
    {
        cout << "链表为空" << endl;
    }
    else
    {
        for(int i = 0; i<index; ++i)
        {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
}

int main()
{
    ListNode *head;
    head = createList();
    printList(head);
    int index = 0;
    int arr[20] = {0};
    arr_to_list_rever(arr ,head , index);
    printArr(arr , index);
}
  • 编程小技巧需要注意
  1. 定义变量或者输入输出时,需要前后空格,让代码变得更加美观
  2. 定义变量名或者函数名时,尽量使用驼峰命名规则
  3. 尽量封装代码,使代码更加简洁
  4. for循环中尽量使用++i这样,不用每次循环过程都保存一个i的临时变量,而是直接先递增再运算。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容