对于创建链表引发的思考

今天刷到一道链表创建的题。平时做的基本是题目给你提供好的链表,而不需要自己创建。

举个例子,对于vector来说,其实,当我们声明如:

vector<int> v(10,0);

所调用的vector类的构造函数内部调用了new来给对象分配了空间。

因此,当你需要创建诸如:链表,二叉树等结构时,对于每一个新加入结点,

都必须为它new分配一个内存,否则,对于如下语句:

ListNode n(10);
ListNode* n = new ListNode(10);

第一条语句,当超出作用域时,会被系统删除掉,这样,你原本链表所链接的内存会被回收,亦即你从来没有创建过这么一个节点。

对于第二条,除非你自己释放空间,否则它会一直占用内存。

因此,创建任何数据结构,记得为它的每一个结点,new一个堆内存,然后再链接它。

力扣2题解:

class Solution {
public:
     //或者完全可以用一条全新的链表,以空间换时间
    //本题被卡住,主要是不会创建链表!!!,必须先申请一个新空间再链接过去*/
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        int carry = 0;
        int sum = 0;
        ListNode n(-1);
        ListNode* current = &n; //用于创建新链表,指针变量自然可以改变指向的变量
        while( l1!=nullptr && l2!=nullptr )
        {   
            sum = l1->val+l2->val+carry;
            ListNode* p = new ListNode( sum%10 );
            carry = sum/10;
            //ListNode p( carry );错误写法,随时被系统回收内存
            current->next = p;
            //n = *(n.next);错误写法,随时更改了头地址内容
            current = current->next; 
            l1 = l1->next;
            l2 = l2->next;
        }

        if( l1==nullptr && l2==nullptr )
        {
            if ( carry != 0 )
            {
                //ListNode p( carry ); 错误写法,随时被系统回收内存
                ListNode* p = new ListNode(carry);
                //n.next = &p;错误写法,随时更改了头地址内容
                current->next = p;
            }
        }
        else if( l1!=nullptr && l2==nullptr )
        {
            while( l1!=nullptr )
            {
                sum = l1->val+carry;
                //ListNode p( sum%10 ); //return时空间会被释放掉,就不存在了,必须new空间出来
                ListNode* p = new ListNode(sum%10);
                carry = sum/10;
                //n.next = &p;
                current->next = p;
                //n = *(n.next);
                current = current->next; //= &p;
                l1 = l1->next;
            }
            if ( carry != 0 )
            {
                //ListNode p( carry );
                //n.next = &p;
                ListNode* p = new ListNode(carry);
                current->next = p;
            }
        }
        else if( l1==nullptr && l2!=nullptr )
        {
            while( l2!=nullptr )
            {
                sum = l2->val+carry;
                //ListNode p( sum%10 );
                ListNode* p = new ListNode(sum%10);
                carry = sum/10;
                //n.next = &p;
                current->next = p;
                //n = *(n.next);
                current = current->next;
                l2 = l2->next;
            }
            if ( carry != 0 )
            {
                //ListNode p( carry );
                ListNode* p = new ListNode(carry);
                //n.next = &p;
                current->next = p;
            }
        }
        return n.next;//ans->next;//&n;//ans->next;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值