Leetcode-2 专业地写一个链表

  一 首先就是涉及到一个null和nullptr的区别的问题。之前就经常出现==NULL的问题。

 

  二 c语言,c++,python如何初始化一个节点指针的问题。

    首先就是c语言,需要十分熟练地使用malloc函数。    

    

#include<bits/stdc++.h>
using namespace std;
typedef struct linklist
{
    int data;
    struct linklist *next;
}Linklist;
int main()
{
    Linklist *p=(Linklist*)malloc(sizeof(Linklist));
    p->data=0;
    p->next=NULL;
    Linklist *head=p;//这样就保存了头节点
    for(int i=1;i<=4;i++)
    {
        Linklist *temp=(Linklist*)malloc(sizeof(Linklist));
        temp->data=i*2;
        temp->next=NULL;
        p->next=temp;
        p=temp;
    }
    p=head;
    while(p!=NULL)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
    return 0;
}

    即使对于c语言的代码风格有所遗忘,看了这一串代码,或者写一下,就能明白了。

 

    下面是c++中。c++主要就是加入了面向对象编程的内容。

    

struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};

    这个要会面向对象编程。复习一下C++即可。

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
int main()
{

    ListNode *l1=new ListNode(1);
    ListNode l2(2);

    cout<<l1->val<<endl;
    cout<<l2.val<<endl;
}

    这样就十分地清楚了。

    Linklist *temp=(Linklist*)malloc(sizeof(Linklist));这是c语言说法。

    至于构造函数,默认构造函数,无参构造函数,这些就是单独的面向对象编程内容了,很简单。

 

 

    代码风格熟悉,指针,引用的问题(Linklist),这个需要实际的熟悉。

    明白指针是一串地址的值,用这个地址为内存块的操作服务就明白了。

三  实际解题过程

    实际操作的时候发现,这是个不怎么方便处理的链表,想要把这个链表相加的程序写地漂亮,并且时空复杂度都尽可能小还是有一定的难度的。

    就这样吧

#include<bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode *p1=l1,*p2=l2;
        int cursum=0;
        int mod=0;

        cursum=p1->val+p2->val+mod;
        mod=cursum/10;
        cursum%=10;
        p1=p1->next;
        p2=p2->next;

        ListNode *ret=new ListNode(cursum);
        ListNode *p=ret;

        while(p1!=nullptr||p2!=nullptr)
        {
            int val1=0,val2=0;
            if(p1!=nullptr)
            {
                val1=p1->val;
                p1=p1->next;
            }
            if(p2!=nullptr)
            {
                val2=p2->val;
                p2=p2->next;
            }
            cursum=val1+val2+mod;
            mod=cursum/10;
            cursum%=10;

            ListNode *temp=new ListNode(cursum);
            p->next=temp;
            p=p->next;
        }
        if(mod==1)
        {
            ListNode *temp=new ListNode(mod);
            p->next=temp;
        }
        return ret;
    }
    void append(ListNode* l,int num)//这个效率不高
    {
        ListNode *p=l;
        while(p->next!=nullptr)p=p->next;
        ListNode *temp=new ListNode(num);
        p->next=temp;
    }
};
int main()
{
    Solution s;
    ListNode *l1=new ListNode(3);
    s.append(l1,4);
    s.append(l1,2);
    ListNode *l2=new ListNode(4);
    s.append(l2,6);
    s.append(l2,5);
    ListNode *ans=s.addTwoNumbers(l1,l2);
    while(ans!=nullptr)
    {
        cout<<ans->val<<endl;
        ans=ans->next;
    }
    return 0;
}

 

posted @ 2021-01-28 00:23  TheDa  阅读(55)  评论(0编辑  收藏  举报