• 剑指offer 06 从尾到头打印链表


     方法一:运用栈:

    根据栈的特点是后进先出,即最后压入栈的元素最先得到,考虑到栈的这一特点,使用栈将链表的元素顺序倒置。从链表头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。

    • 创建一个栈,用于存储链表的节点
    • 创建一个指针,初始时指向链表的头节点
    • 当指针指向的元素非空时,重复下列操作:
      • 将指针指向的节点压入栈内
      • 将指针移到当前节点的下一个节点
    • 获得栈的大小 size,创建一个数组 print,其大小为 size
    • 创建下标并初始化 index = 0
    • 重复 size 次下列操作:
      • 从栈内弹出一个节点,将该节点的值存到 print[index]
      • 将 index 的值加 1

    方法二。链表反转


    2
    * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * struct ListNode *next; 6 * }; 7 */ 8 9 10 /** 11 * Note: The returned array must be malloced, assume caller calls free(). 12 */ 13 int* reversePrint(struct ListNode* head, int* returnSize){ 14 if(head==NULL) 15 { 16 *returnSize=0; 17 return 0; 18 } 19 int n=0,i; 20 struct ListNode *p=head; //创建一个指针初始时指向链表的头节点 21 while(p!=NULL) 22 { 23 n++; 24 p=p->next; 25 } 26 int *a=(int*)calloc(n,sizeof(int)); //创建一个数组,大小为n 27 for(i=0;i<n;i++) 28 { 29 a[n-1-i]=head->val; 30 head=head->next; 31 } 32 *returnSize=n; 33 return a; 34 }

    方法二:递归

    关于递归的方法是看见一位大佬写的,觉得很厉害。给大家分享一下。

     1 int* reversePrint(struct ListNode* head, int* returnSize){
     2     if(head == NULL){
     3         *returnSize = 0;
     4         return malloc(sizeof(int) * 10000);
     5     }
     6     int *ans = reversePrint(head->next, returnSize);
     7     ans[(*returnSize)++] = head->val;
     8     return ans;
     9 }
    10 
    11 作者:ning-junzhi
    12 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/c-jian-dan-yi-dong-de-jie-fa-by-ning-junzhi/
    13 来源:力扣(LeetCode)
    14 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    HTTP的连接过程
    查看mysql数据库及表编码格式
    spring quartz 的定时器cronExpression表达式写法(转载)
    两种 js下载文件的步骤
    进制转换三(二进制、八进制、十进制、十六进制之间的转换)
    进制的转换二
    Tls版本
    读李笑来《把时间当做朋友》笔记
    postman批量编辑参数
    uml类关系常见图标的含义
  • 原文地址:https://www.cnblogs.com/sbb-first-blog/p/13276483.html
Copyright © 2020-2023  润新知