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