面试题06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
思路:
设定两个链表指针swap2去除链表中的值然后指向swap1,然后swap在等于swap实现链表向前移动。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
if(head==NULL){
*returnSize=0;
return 0;
}
int length=0;
struct ListNode *swap1=NULL;
struct ListNode *swap2=NULL;
while(head!=NULL){
swap2=head;
head=head->next;
swap2->next=swap1;
swap1=swap2;
length++;
}
*returnSize=length;
int *res=(int *)malloc(sizeof(int)*length);
int flag=0;
for(int i=0;i<length;i++){
res[i]=swap1->val;
swap1=swap1->next;
}
return res;
}
标准答案:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
if (!head){
*returnSize = 0;
return 0;
}
struct ListNode * curr = head;
struct ListNode * temp;
int len = 1;
while (curr->next){
// 将 temp 摘出
temp = curr->next;
curr->next = temp->next;
// 将 temp 插入头节点前
temp->next = head;
// 头节点重新指向头部
head = temp;
len++;
}
*returnSize=len;
int *res=(int *)malloc(sizeof(int)*len);
for(int i=0;i<len;i++)
{
res[i]=head->val;
head=head->next;
}
return res;
}