将用链表表示的数字加 1?
数字的链表表示方式是,链表的所有节点都被视为数字的一位。节点存储数字的方式是:链表的第一个元素保存数字的最高位,最后一个元素保存数字的最低位。例如,数字 202345 在链表中表示为 (2->0->2->3->4->5)。
要将此链表表示的数字加 1,我们必须检查链表最低位的数值。如果它小于 9,则没有问题;否则,代码将更改下一位数字,以此类推。
现在让我们看一个例子,了解如何操作:1999 表示为 (1->9->9->9),将 1 加到它应该将其更改为 (2->0->0->0)
Input:1999 Output:2000
解释
将 1 加到用链表表示的给定数字,意味着遵循以下步骤:
- 反转链表:需要反转链表,这意味着将最后一位数字改为第一位,第一位改为最后一位。例如,1->9->9->9 转换为 9->9->9->1。
- 对于此更改后的链表,现在遍历链表,在最左边的节点上加一。如果该节点的值等于 9,则将进位传播到下一个节点。重复此过程,直到没有进位为止。
- 将链表反转回原始形式,然后返回头节点以打印结果。
示例
#include <iostream> using namespace std; //n=next node ; d=data ; p= previous node; h=head node; c=current node class Node { public: int d; Node* n; }; Node *newNode(int d) { Node *new_node = new Node; new_node->d = d; new_node->n = NULL; return new_node; } Node *reverse(Node *h) { Node * p = NULL; Node * c = h; Node * n; while (c != NULL) { n = c->n; c->n = p; p = c; c = n; } return p; } Node *addOneUtil(Node *h) { Node* res = h; Node *temp, *p = NULL; int carry = 1, sum; while (h != NULL) { sum = carry + h->d; carry = (sum >= 10)? 1 : 0; sum = sum % 10; h->d = sum; temp = h; h = h->n; } if (carry > 0) temp->n = newNode(carry); return res; } Node* addOne(Node *h) { h = reverse(h); h = addOneUtil(h); return reverse(h); } int main() { Node *h = newNode(1); h->n = newNode(9); h->n->n = newNode(9); h->n->n->n = newNode(9); h = addOne(h); while (h != NULL) { cout << h->d; h = h->n; } cout<<endl; return 0; }
广告