剑指offer——day2

题目一
在这里插入图片描述

思路:两次遍历。一次遍历出链表的元素个数。第二次依次插入数据

int* reversePrint(struct ListNode* head, int* returnSize){
    int i=0;
    struct ListNode*cur=head;
    while(head)
    {
        head=head->next;
        i++;
    }
    *returnSize=i;
    int*res=(int*)malloc(sizeof(int)*i);
    while(cur)
    {
        res[--i]=cur->val;
        cur=cur->next;
    }
    return res;
}

题目二
在这里插入图片描述

思路:头插法

struct ListNode* reverseList(struct ListNode* head)
{
    if(head==NULL)
        return head;
    struct ListNode*Head=NULL;
    while(head)
    {
        struct ListNode*newnode=head;
        struct ListNode*next=head->next;
        newnode->next=Head;
        Head=newnode;
        head=next;
    }
    return Head;
}

题目三
在这里插入图片描述

第一次遍历:先将复制的结点链接在原结点的后面,不管随机指针。
第二次遍历,复制结点的随机指针指向原结点随机指针的下一个结点
第三次遍历:将现在的链表拆分为两个链表;方法为尾插法

class Solution {
public:
    Node* copyRandomList(Node* head) {
        Node* cur=head;
        while(cur)
        {
            Node* next=cur->next;
            Node* newcode=(Node*)malloc(sizeof(Node));
            newcode->val=cur->val;
            newcode->next=next;
            cur->next=newcode;
            cur=next;
        }
        //处理随机指针
        cur=head;
        while(cur)
        {
            Node*next=cur->next->next;
            Node*newcode=cur->next;
            if(cur->random!=NULL)
            {
                newcode->random=cur->random->next;
            }
            else
            {
                newcode->random=NULL;
            }
            cur=next;
        }
        //拆为目标链表,使用尾插法
        Node*newhead=NULL;
        Node*tail=NULL;
        cur=head;
    while(cur)  
    {
        Node*newcode=cur->next;
        Node*next=newcode->next;
        if(newhead==NULL)
        {
            newhead=tail=newcode;
        }
        else
        {
            tail->next=newcode;
            tail=newcode;
        }
        cur->next=next;
        cur=next;
    }
    return newhead;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值