链表OJ--下

文章目录

  • 前言
  • 一、链表分割
  • 二、环形链表I
  • 三、环形链表II
  • 四、链表的回文结构
  • 五、随机链表的复制


前言

一、链表分割

牛客网CM11:链表分割- - -点击此处传送
链表OJ--下_第1张图片
题解:
思路图:
链表OJ--下_第2张图片
代码:
链表OJ--下_第3张图片

二、环形链表I

力扣141:环形链表- - -点击此处传送
链表OJ--下_第4张图片
思路图:
链表OJ--下_第5张图片
扩展问题:
链表OJ--下_第6张图片

代码:

bool hasCycle(struct ListNode *head) {
    struct ListNode*fast=head,*slow=head;
    while(fast && fast->next)
    {
    	//slow走一步
        slow=slow->next;
        //fast走两步
        fast=fast->next->next;
        //若相等(相遇)则有环,返回true并退出程序
        if(fast==slow)
        {
            return true;
        }
    }
    //否则无环
    return false;
}

三、环形链表II

力扣142:环形链表II- - -点击此处传送
链表OJ--下_第7张图片
题解:
思路图:
链表OJ--下_第8张图片
代码:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode*fast=head;
    struct ListNode*slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
        {
            struct ListNode*meet=slow;
            while(head != meet)
            {
                head=head->next;
                meet=meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

四、链表的回文结构

牛客网OR36:链表的回文结构- - -点击此处传送
链表OJ--下_第9张图片
思路图:
链表OJ--下_第10张图片

代码:

struct ListNode*reverseList(struct ListNode*head)
    {
        struct ListNode*cur=head;
        struct ListNode*newhead=NULL;
        while(cur)
        {
            struct ListNode*next=cur->next;
            cur->next=newhead;
            newhead=cur;
            cur=next;
        }
        return newhead;
    }
    struct ListNode*middleNode(struct ListNode*head)
    {
        struct ListNode*slow=head;
        struct ListNode*fast=head;
        while(fast && fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    bool chkPalindrome(ListNode* head) {
        struct ListNode*mid=middleNode(head);
        struct ListNode*rhead=reverseList(mid);
        while(head && rhead)
        {
            if(head->val != rhead->val)
                return false;
            head=head->next;
            rhead=rhead->next;
        }
        return true;
    }

五、随机链表的复制

力扣138:随机链表的复制- - -点击此处传送
链表OJ--下_第11张图片
思路图:
链表OJ--下_第12张图片
代码:

struct Node* copyRandomList(struct Node* head) 
{
	struct Node*cur=head;
    while(cur)
    {
        struct Node*copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;

        copy->next=cur->next;
        cur->next=copy;

        cur=copy->next;
    } 
    cur=head;
    while(cur)
    {
        struct Node*copy=cur->next;
        if(cur->random==NULL)
        {
             copy->random=NULL;
        }
           
        else
        {
            copy->random=cur->random->next;
        }
            
        cur=copy->next;
    }
    cur=head;
    struct Node*newhead=NULL;
    struct Node*tail=NULL;
    while(cur)
    {
        struct Node*copy=cur->next;
        struct Node*next=copy->next;
        if(tail==NULL)
        {
            newhead=tail=copy;
        }
        else
        {
            tail->next=copy;
            tail=tail->next;
        }
        cur->next=next;
        cur=next;
    }
    return newhead;
}

你可能感兴趣的:(链表,数据结构)