一、题目
二、解题思路
(1)思路一
例如给的数值为123,循环除以10,余数为拆分出的个、十、百、千位等,当商为0时,为结束标志。可以把每位的数值存储到链表中,123我们先把先算出的3放在链表头部,后面的2和1再往链表后面陆续追加,追加时我可以用一个临时变量来记录123一共有多少位,所有数值追加之后,计数为2,我们再从头部遍历数值:
第一个数为3,计算值3*(10^2)=300,计数减一。
第二个数为2,计算值2*(10^1)=20,结果值等于300+20=320,计数减一。
第三个数为1,计算值1*(10^0)=1,320+1=321,返回结果。
数值分解加入到链表中
123 / 10 = 12 … 3
计数:0
12 / 10 = 1 … 2
计数:1
1 / 10 = 0 … 1
计数:2
加入完,链表中存储的数据
val : 3, next : 105000060
val : 2, next : 105000120
val : 1, next : 0
三、虚机测试代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct DataList
{
int val;
struct DataList *next;
};
typedef struct DataList DL;
void main()
{
int reverse(int x);
int TestNum = 123;
int res = reverse(TestNum);
printf("TestNum : %d, res : %d\n",TestNum,res);
}
int reverse(int x)
{
printf("%lf\n",pow(2,31)-1);
DL *CreateHeadLink(int num);
void InsertData2Link(DL *head, int num);
void PrintfHeadList(DL *head);
int ComputeHeadList(DL *head, int cnt);
int res1 = 0;
int res2 = 0;
int cnt = 0;
int flg = 0;
if(x == -2147483648)
{
return 0;
}
else if(x < 0)
{
flg = 1;
x = abs(x);
}
res1 = x / 10;
res2 = x % 10;
DL *head = CreateHeadLink(res2);
while(1)
{
if(res1 == 0)
{
break;
}
else
{
res2 = res1 % 10;
res1 = res1 / 10;
cnt++;
printf("res1 : %d, res2 : %d, cnt : %d\n",res1,res2,cnt);
InsertData2Link(head, res2);
}
}
//PrintfHeadList(head);
if(flg)
{
return (ComputeHeadList(head,cnt) * (-1));
}
else
{
return ComputeHeadList(head,cnt);
}
}
DL *CreateHeadLink(int num)
{
DL *head = malloc(sizeof(DL));
head->val = num;
head->next = NULL;
return head;
}
void InsertData2Link(DL *head, int num)
{
DL *p = head;
DL *q = malloc(sizeof(DL));
while(p->next != NULL)
{
p = p->next;
}
p->next = q;
p = q;
p->val = num;
p->next = NULL;
}
void PrintfHeadList(DL *head)
{
DL *p = head;
while(p != NULL)
{
printf("val : %d, next : %o\n",p->val,p->next);
p = p->next;
}
}
int ComputeHeadList(DL *head, int cnt)
{
if(cnt == 9 && (head->val > 2))
{
return 0;
}
DL *p = head;
int res = 0;
int tmp = cnt;
while(p != NULL)
{
res = (p->val) * pow(10,cnt) + res;
printf("val : %d, next : %o, cnt : %d, res : %d\n",p->val,p->next,cnt,res);
cnt--;
p = p->next;
if(p != NULL && tmp == 9 && ((2147483647 - res) < ((p->val)* pow(10,cnt))))
{
return 0;
}
}
return res;
}
四、虚机测试截图
五、leecode提交代码
struct DataList
{
int val;
struct DataList *next;
};
typedef struct DataList DL;
int reverse(int x)
{
DL *CreateHeadLink(int num);
void InsertData2Link(DL *head, int num);
int ComputeHeadList(DL *head, int cnt);
int res1 = 0;
int res2 = 0;
int cnt = 0;
int flg = 0;
if(x == -2147483648)
{
return 0;
}
else if(x < 0)
{
flg = 1;
x = abs(x);
}
res1 = x / 10;
res2 = x % 10;
DL *head = CreateHeadLink(res2);
while(1)
{
if(res1 == 0)
{
break;
}
else
{
res2 = res1 % 10;
res1 = res1 / 10;
cnt++;
InsertData2Link(head, res2);
}
}
if(flg)
{
return (ComputeHeadList(head,cnt) * (-1));
}
else
{
return ComputeHeadList(head,cnt);
}
}
DL *CreateHeadLink(int num)
{
DL *head = malloc(sizeof(DL));
head->val = num;
head->next = NULL;
return head;
}
void InsertData2Link(DL *head, int num)
{
DL *p = head;
DL *q = malloc(sizeof(DL));
while(p->next != NULL)
{
p = p->next;
}
p->next = q;
p = q;
p->val = num;
p->next = NULL;
}
int ComputeHeadList(DL *head, int cnt)
{
if(cnt == 9 && (head->val > 2))
{
return 0;
}
DL *p = head;
int res = 0;
int tmp = cnt;
while(p != NULL)
{
res = (p->val) * pow(10,cnt) + res;
cnt--;
p = p->next;
if(p != NULL && tmp == 9 && ((2147483647 - res) < ((p->val)* pow(10,cnt))))
{
return 0;
}
}
return res;
}
六、leecode提交截图