剑指offer(牛客)——从尾到头打印链表

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2022年4月10日
📨 博主码云地址:博主码云地址
📕参考书籍:java核心技术 卷1 和 数据结构(C语言版)
📢编程练习:牛客网+力扣网
由于博主目前也是处于一个学习的状态,如有讲的不对的地方,请一定联系我予以改正!!!

OJ连接从尾到头打印链表

C语言版本

思路:既然是要从尾到头的打印链表,那么我们就可以先将链表反转,然后进行遍历,存储到一个数组里面去,具体的代码实现如下

代码实现:

int* printListFromTailToHead(struct ListNode* head, int* returnSize ) {
    if(head==NULL)return NULL;
    //先反转链表
    struct ListNode* pre = NULL;
    struct ListNode* cur = head->next;
    //由于要存放到数组中,那么我们要动态申请一片空间,用count在
    //反转链表的同时能够确定要动态开辟内存的大小
    int count = 0;
    while(cur!=NULL)
    {
        count++;
        head->next=pre;
        pre=head;
        head=cur;
        cur=cur->next;
    }
    //最后一步连接head与pre,在计数一次
    head->next=pre;
    count++;
    //开始遍历
    struct ListNode* tmp = head;
    //申请内存
    int* arr = (int*)malloc(sizeof(int)*count);
    //用来表示数组的下标
    int i = 0;
    while(tmp!=NULL)
    {
        arr[i]=tmp->val;
        i++;
        tmp=tmp->next;
    }
    //count就是数组行数
    *returnSize = count;
    //返回数组名即可
    return arr;
}

JAVA版本

解题思路同C语言版本,这里就直接给出代码如何去实现

import java.util.*;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        if(listNode==null)return list;
        //反转链表
        ListNode pre = null;
        ListNode cur = listNode.next;
        while(cur!=null){
            listNode.next=pre;
            pre=listNode;
            listNode=cur;
            cur=cur.next;
        }
        listNode.next=pre;
        cur=listNode;
        while(cur!=null){
            list.add(cur.val);
            cur=cur.next;
        }
        return list;
    }
}

总结

以上就是对于剑指offer(牛客)第一题个人给出的一个解法,实际上对于本题只需想到反转链表进行遍历即可,其实还是考察对于链表的基本操作,只需要画一个图理解,这种题并不算难题,之后有空我会在持续更新剑指offer后面的解法

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

to Keep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值