我创建了一个函数
int reverseNum(Node *head)
来从反向链表中获取数字。
例如。对于链接列表:- 1->2->3->4,数字将为 4321。
但程序返回 4320。
#include <bits/stdc++.h>
#define vi vector<int>
using namespace std;
struct Node {
int data;
Node *next;
Node(int x,Node *n){
data=x;
next=n;
}
Node(int x){
data=x;
next=nullptr;
}
};
//arr to LL
Node *arrToLL(vector<int> &arr){
//chk if the arr is empty
if (arr.empty()){
return nullptr;
}
Node *head=new Node(arr[0]);
Node *tmp=head;
for (int i=1;i<arr.size();i++){
Node *newNode=new Node(arr[i]);
tmp->next=newNode;
tmp=newNode;
}
return head;
}
//get reverse number from the LL
int reverseNum(Node *head){
int ans=0;
int exp=0;
while (head!=nullptr){
ans += (head->data * pow(10, exp));
cout<<ans<<"-";
exp++;
head=head->next;
}
return ans;
}
int main(){
vi arr1={1,2,3,4};
vi arr2={3,5,6};
Node *head1=arrToLL(arr1);
Node *head2=arrToLL(arr2);
cout<<reverseNum(head1);
return 0;
}
pow
函数返回double
类型,因为它使用浮点算法。这可能会导致不精确,就像用户询问为什么当 n=5 时 pow(n,2) 在我的编译器和操作系统中返回 24?。
您不需要为此依赖浮点计算。不要使用
exp
,而是使用具有所需能力的变量,并且该变量在每次迭代中乘以 10:
int reverseNum(Node *head){
int ans=0;
int power=1; // <---
while (head!=nullptr){
ans += head->data * power; // <---
cout<<ans<<"-";
power *= 10; // <---
head=head->next;
}
return ans;
}
现在您的代码中不再有浮点处理,输出将符合预期。