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后面的解法