算法3:程序21-22

程序21:拷贝含随机指针的链表

#include<iostream> //拷贝含随机指针的链表
using namespace std;
#include<hash_map>

struct Node
{
    int value;
    Node*next;
    Node*random;
    Node(int val)
    {
        value=val;
        next=NULL;
        random=NULL;
    }
};

Node* copyListWithRand1(Node *head)  //未完成
{
    if(head==NULL)
    {
        return NULL;
    }
}
Node* copyListWithRand2(Node *head)  //额外空间为O(1)
{
    if(head==NULL)
    {
        return NULL;
    }
    Node* cur=head;
    Node*next=NULL;
    while (cur!=NULL)
    {
        next=cur->next;
        cur->next=new Node(cur->value); //在new的同时将值拷了进去
        cur->next->next=next;
        cur=next;
    }
    cur=head;
    Node*copy=NULL;
    while(cur!=NULL)
    {
        copy=cur->next;
        copy->random=cur->random==NULL?NULL:cur->random->next;
        cur=cur->next->next;
    }

    cur=head;
    Node*res=cur->next;
    while(cur!=NULL)
    {
        next=cur->next->next;
        copy=cur->next;
        cur->next=next;
        copy->next=next==NULL?NULL:next->next;
        cur=next;
    }
    return res;

};
int main()
{

    Node *head1 = NULL;
    head1=new Node(1);
    head1->next=new Node(2); //一定要new;用类似于有参构造初始化
    Node*res=copyListWithRand2(head1);
    cout<<res->value<<endl;
    cout<<head1->next->random;

    return 0;
}

程序22:两个单链表相交的一系列问题

#include<iostream> //两个单链表相交的一系列问题
using namespace std;

struct Node
{
    int value;
    Node *next;
    Node(int val)
    {
        value=val;
        next=NULL;
    } 
};


Node* getLoopNode(Node* head)
{
    if(head==NULL||head->next==NULL||head->next->next==NULL)
    {
        return NULL;
    }
    Node* n1=head->next;
    Node* n2=head->next->next;
    while(n1!=n2)
    {
        if(n1==NULL||n2==NULL)
        {
            return NULL;
        }
        n1=n1->next;
        n2=n2->next->next;
    }
    n2=head;
    while (n1!=n2)
    {
        n1=n1->next;
        n2=n2->next;
    }
    return n1;
}

Node* noLoop(Node* head1,Node* head2)
{
    if(head1==NULL||head2==NULL)
    {
        return NULL;
    }
    int n=0;
    Node* cur1=head1;
    Node* cur2=head2;
    while (cur1!=NULL)
    {
        n++;
        cur1=cur1->next;
    }
    while (cur2!=NULL)
    {
        n--;
        cur2=cur2->next;
    }
    if(cur1!=cur2)
    {
        return NULL;
    }    
    cur1=n>0?head1:head2;
    cur2=cur1==head1?head2:head1;
    n=abs(n);
    while (n!=0)
    {
        cur1=cur1->next;
        n--;
    }
    while (cur1!=cur2)
    {
        cur1=cur1->next;
        cur2=cur2->next;
    }
    return cur1;
}
Node* bothLoop(Node* head1,Node* loop1,Node* head2,Node* loop2)
{
    Node* cur1=NULL;
    Node* cur2=NULL;
    if(loop1==loop2)
    {
        cur1=head1;
        cur2=head2;
        int n=0;
        while (cur1!=loop1)
        {
            n++;
            cur1=cur1->next;
        }
        while (cur2!=loop2)
        {
            n--;
            cur2=cur2->next;
        }
        cur1=n>0?head1:head2;
        cur2=cur1==head1?head2:head1;
        n=abs(n);
        while (n!=0)
        {
            cur1=cur1->next;
            n--;
        }
        while (cur1!=cur2)
        {
            cur1=cur1->next;
            cur2=cur2->next;
        }
        return cur1;      
    }
    else
    {
        cur1=loop1->next;
        while(cur1!=loop1)
        {
            if(cur1==loop2)
            {
                return loop2;
            }
            cur1=cur1->next;
        }
        return NULL;
    }

}

Node* getIntersectNode(Node* head1,Node* head2)
{
    if(head1==NULL||head2==NULL)
    {
        return NULL;
    }
    Node* loop1=getLoopNode(head1);
    Node* loop2=getLoopNode(head2);
    if(loop1==NULL&&loop2==NULL)
    {
        return noLoop(head1,head2);
    }
    if(loop1!=NULL&&loop2!=NULL)
    {
        return bothLoop(head1,loop1,head2,loop2);
    }
    return NULL;
}

int main()
{
    Node *head1=NULL;
    head1=new Node(1);
    Node* cur=new Node(2);
    cout<<cur<<endl;
    head1->next=cur;

    Node* head2=new Node(3);
    head2->next=cur;

    cout<<getIntersectNode(head1,head2);

    return 0;
}
全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务