翻倍以链表形式表示的数字



 

题目:

示例: 


 

思路:

有点相似于:链表相加II,这道题我们仍然有进位,但不同的是,链表相加我们选择了开辟新节点,这道题我们选择反转两次链表,开始一次,结束一次。

 

单链表的翻转详细讲解反转一个单链表(<---点击可看详解) 


题解代码: 

 

struct ListNode* reverse(struct ListNode* head)
{
    struct ListNode* n1 = NULL;
    struct ListNode* n2 = head;
    struct ListNode* n3 = NULL;
    if(n2)
	    n3 = n2->next;
 
    while (n2)
    {
	    n2->next = n1;
	    n1 = n2;
	    n2 = n3;
	    if (n3)
		    n3 = n3->next;
    }
 
    return n1;
}

struct ListNode* doubleIt(struct ListNode* head)
{
    struct ListNode* prev = NULL;
    struct ListNode* Back = reverse(head);

    head = Back;
    int add = 0;

    while(Back)
    {
        int temp = Back->val * 2 + add;
        add = temp / 10;

        prev = Back;

        Back->val = temp % 10;
        Back = Back->next;
    }

    if(add > 0)
    {
        struct ListNode* newnode = malloc(sizeof(struct ListNode));
        newnode->val = add;
        newnode->next = NULL;

        prev->next = newnode;
    }

    head = reverse(head);
    return head;
}

 个人主页:Lei宝啊

愿所有美好如期而遇

 

好的,以下是一个简单的C++链表类,它可以存储数字,并且可以实现链表形式的两个数字相乘: ```c++ #include <iostream> using namespace std; class Node { public: int val; Node* next; Node(int val): val(val), next(NULL) {} }; class LinkedList { private: Node* head; public: LinkedList(): head(NULL) {} void add(int val) { Node* node = new Node(val); if(head == NULL) { head = node; } else { Node* p = head; while(p->next != NULL) { p = p->next; } p->next = node; } } void print() { Node* p = head; while(p != NULL) { cout << p->val << " "; p = p->next; } cout << endl; } LinkedList operator*(LinkedList& list) { LinkedList result; Node* p = head; while(p != NULL) { Node* q = list.head; LinkedList temp; int carry = 0; while(q != NULL) { int product = p->val * q->val + carry; temp.add(product % 10); carry = product / 10; q = q->next; } if(carry > 0) { temp.add(carry); } LinkedList zero; for(int i = 0; i < p - head; i++) { zero.add(0); } temp.head = zero.head; result = result + temp; p = p->next; } return result; } LinkedList operator+(LinkedList& list) { LinkedList result; Node* p = head; Node* q = list.head; int carry = 0; while(p != NULL || q != NULL) { int sum = (p != NULL ? p->val : 0) + (q != NULL ? q->val : 0) + carry; result.add(sum % 10); carry = sum / 10; if(p != NULL) p = p->next; if(q != NULL) q = q->next; } if(carry > 0) { result.add(carry); } return result; } }; int main() { LinkedList list1; LinkedList list2; list1.add(2); list1.add(3); list2.add(4); list2.add(5); LinkedList result = list1 * list2; result.print(); return 0; } ``` 这个链表类有两个私有成员变量:head和tail,head指向链表的第一个节点,tail指向链表的最后一个节点。它有一个公有成员函数add,用于向链表中添加节点;还有一个公有成员函数print,用于打印链表中的所有节点。此外,它还重载了运算符*和+,用于实现链表形式的两个数字相乘和相加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lei宝啊

觉得博主写的有用就鼓励一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值