链表oj (环形链表oj)

news2024/9/27 17:26:25

文章目录

1.数组oj

2.链表oj

文章内容

1.数组oj

1. 原地移除数组中所有的元素值为val,要求时间复杂度为O(N),空间复杂度为O(1)。力扣

int removeElement(int* nums, int numsSize, int val){

        int k = numsSize;
        int a = 0;
        int b = 0;
        while(b<k)
        {
            if(nums[b] != val)
            {
                nums[a] = nums[b];
                a++;
                b++;
            }
           else
            {
                b++;
            }
        }
        return a;

}

2. 删除排序数组中的重复项。力扣

int removeDuplicates(int* nums, int numsSize){

int src = 1;
int dest = 0;

while(src < numsSize)
{
if(nums[src] == nums[dest])
{
src++;
}
else
{
    dest++;
    nums[dest] = nums[src] ;
    src++;
}

}

return dest+1;
}

 3. 合并两个有序数组。力扣

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){

        int end1 = m-1;
        int end2 = n-1;
        
        while(end1>=0 && end2>=0)
        {
            if(nums1[end1] > nums2[end2])
            {
                nums1[nums1Size-1] = nums1[end1];
                end1--;
                nums1Size--;
            }
            else
            {
                nums1[nums1Size-1] = nums2[end2];
                end2--;
                nums1Size--;
            }

        }
        while(end2>=0)
        {
          nums1[nums1Size-1] = nums2[end2];
          end2--;
          nums1Size--;
        }

        //return nums1;
}

2.链表oj

1. 删除链表中等于给定值 val 的所有结点。力扣

struct ListNode* removeElements(struct ListNode* head, int val){

struct ListNode* prve = NULL;
struct ListNode* cur = head;

while(cur)
{

   if(cur->val == val) 
   {
   
      if(cur == head)
       {
          head = cur->next;
          free(cur);
          cur = head;
       }
       else
       {
          prve->next = cur->next;
          free(cur);
          cur=prve->next;
       }
   }
   else{
      prve = cur;
      cur = cur->next;
   }

}

   return head;
}

2. 反转一个单链表。力扣

方法一:

struct ListNode* reverseList(struct ListNode* head)
{

struct ListNode* newhead = NULL;
struct ListNode* cur = head;


while(cur)
{

struct ListNode* after = cur->next;

//头插
cur->next = newhead;

newhead = cur;
cur = after;
}

return newhead;

}

方法二:

 思维图

 

struct ListNode* reverseList(struct ListNode* head){

    struct ListNode*  n1,* n2,* n3;
    n1 = NULL;
    n2 = head;

    if(n2)
    {
      n3 = n2->next;
    }

    while(n2)
    {
     n2->next = n1;

     //往后走
      n1 = n2;
      n2 = n3;

      if(n3)
      {
        n3 = n3->next;
      }

    }
    return n1;
}

3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则
返回第二个中间结点。力扣

 

  4. 输入一个链表,输出该链表中倒数第k个结点。链表中倒数第k个结点_牛客题霸_牛客网

本题思路与上一题类似。

 

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
struct ListNode* fast =  pListHead;
struct ListNode* slow =  pListHead;


while(k--)
{

 if(fast == NULL)
{
 return NULL;
}

fast = fast->next;
}

while(fast)
{
slow=slow->next;
fast=fast->next;
}

return slow;

}

5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有
结点组成的。力扣

  6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结
点之前 。链表分割_牛客题霸_牛客网

 

 

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
     struct ListNode* phead = pHead;
    struct ListNode * lesshead,*lesstail,*greaterhead,*greatertail;

    lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));
    greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode));
    while(phead)
    {
     if(phead ->val < x)
     {
      lesstail ->next = phead;
      lesstail = lesstail->next;

     }
     else
     {
    greatertail ->next = phead;
    greatertail = greatertail->next;

 
     }

    phead= phead->next;
    }
        lesstail->next = greaterhead->next;
     free(greaterhead);
    struct ListNode* head = lesshead->next;
     free(lesshead);
    greatertail->next = NULL;
    
    return head;
    }
};

7. 链表的回文结构。链表的回文结构_牛客题霸_牛客网

本题需要用到查找中间节点,和逆置链表,这两项,上述内容都有

 

 

struct ListNode* middleNode(struct ListNode* head) {
	struct ListNode* slow = head, * fast = head;

	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;

	}

	return slow;
}

struct ListNode* reverseList(struct ListNode* head)
{

	struct ListNode* newnode = NULL;
	struct ListNode* cur = head;


	while (cur)
	{

		struct ListNode* after = cur->next;

		//头插
		cur->next = newnode;
		newnode = cur;

		cur = after;
	}

	return newnode;

}

class PalindromeList {
public:
    bool chkPalindrome(ListNode* head)
     {
        // write code here
    struct ListNode * mid = middleNode(head);
     struct ListNode * rmid = reverseList(mid);

    while(rmid && head)
    {
    if(rmid->val != head->val)
    {
    return false;
    }
     rmid = rmid->next;
     head= head->next;

    }

return true;
     }

};

8. 输入两个链表,找出它们的第一个公共结点。力扣

 

 

 故本题的思路就是先计算出两个链表的长度,之后让长的链表先走差值步。之后两个链表一起走,如果两个链表遍历到最后都没有公共节点,那么说明两个链表不相交。

 

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode* cura = headA,*curb = headB;
    int len1 = 0;
    int len2 = 0;
    while(cura)
    {
        cura = cura->next;
        ++len1;
    }
   while(curb)
    {
        curb = curb->next;
        ++len2;
    }
    int gab = abs(len1-len2);

    if(len1>len2)
  {
    while(gab--)
    {
     headA = headA ->next;
    }
    while(headA != headB && headA  &&  headB)
    {
        headA = headA->next;
        headB = headB->next;
    }
    if(headA == NULL)
    {
        return NULL;
    }
    return headA;
  }
    else
    {
           while(gab--)
    {
     headB = headB ->next;
    }
    while(headA != headB && headA  &&  headB)
    {
        headA = headA->next;
        headB = headB->next;
    }
    if(headA == NULL)
    {
        return NULL;
    }
    return headA; 
    }

}

9. 给定一个链表,判断链表中是否有环。力扣

 这到题的思路还是用快慢指针的思想来,快指针走两步,慢指针走一步,如果有环,快指针是回追上慢指针的。

 

bool hasCycle(struct ListNode *head) {

    struct ListNode* slow = head,*fast = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(slow == fast)
        {
        return true;
        }
    }
    return false;
}

10. 给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL力扣

   快指针每次走两步,满指针每次走一步,每次差1步,当链表中有环,快指针肯定能追上满指针

这是为什么呢?

 快指针走其他步呢?

 

 

 有了以上的基础性分析,我们接下来再进行分析:

 上图第一句话是 “右侧分析是典型的错误”!!!

 

 

 

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* slow = head ,*fast = head;

    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;

        if(slow == fast)
        {
            struct ListNode* meet = slow;

            while(head != meet)
            {
                meet = meet->next;
                head = head->next;

            }

        return meet;
        }

    } 

        return NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7安装jdk8教程——rpm安装

1. rpm文件下载 下载链接 Java SE 8 Archive Downloads (JDK 8u211 and later) 2.上传到服务器指定路径下并安装 切换到上传目录&#xff0c;然后执行以下命令 rpm -ivh jdk-8u221-linux-x64.rpm3. 设置环境变量并重载配置 # 设置环境变量 vim /etc/profile# 文件末尾添加…

【网站搭建】开源社区Flarum搭建记录

环境 服务器系统&#xff1a;腾讯云 OpenCloudOS 宝塔版本&#xff1a;免费版8.0.1 Nginx&#xff1a;1.24.0 MySQL&#xff1a;5.7.42 PHP&#xff1a;8.1.21 萌狼蓝天 2023年8月7日 PHP设置 1.安装扩展&#xff1a;flieinfo、opcache、exif 2.解除禁用函数&#xff1a;putenv…

Llama 2 with langchain项目详解(一)

Llama 2 with langchain项目详解(一) 2023年2月25日,美国Meta公司发布了Llama 1开源大模型。随后,于2023年7月18日,Meta公司发布了Llama 2开源大模型,该系列包括了70亿、130亿和700亿等不同参数规模的模型。相较于Llama 1,Llama 2的训练数据增加了40%,上下文长度提升至…

直线模组在AGV物流设备起什么作用?

在物流产业高速发展的今天&#xff0c;机器人技术的应用程度已经成为决定企业间相互竞争和未来发展的重要衡量因素。智能机器人运用到物流产业&#xff0c;其效率不言而喻。AGV智能仓储作为现代物流系统的重要组成部分&#xff0c;物流自动化、智能化不光是能提升效率和安全性&…

前端懒加载

懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分…

Java GUI,mybatis实现资产管理系统

Java GUI——资产管理系统 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 资产管理系统录制视频&#xff0c;从头敲到尾 模块划分 资产信息管理 资产信息查询 …

【Linux取经路】进程的奥秘

文章目录 1、什么是进程&#xff1f;1.1 自己写一个进程 2、操作系统如何管理进程&#xff1f;2.1 描述进程-PCB2.2 组织进程2.3 深入理解进程 3、Linux环境下的进程3.1 task_struct3.2 task_struct内容分类3.3 组织进程3.4 查看进程属性 4、结语 1、什么是进程&#xff1f; 在…

Java GUI——网页浏览器开发

Java GUI——网页浏览器开发 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 网页浏览器开发录制视频&#xff0c;从头敲到尾 任务需求 界面需求 菜单栏 文件 【…

构建IT项目价值管理体系︱陆金所控股有限公司项目管理专家朱磊

陆金所控股有限公司项目管理专家朱磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;陆控-构建IT项目价值管理体系。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; IT资源有限&#xff0c;…

常见的几大排序问题

前言&#xff1a;排序问题&#xff0c;是数据结构中的一大重要的组成板块&#xff0c;很多的面试机试中都会多多少少的涉及到排序问题&#xff0c;之前在上数据结构的那个学期整理过排序问题&#xff0c;不过大都是囫囵吞枣&#xff0c;不求甚解&#xff0c;今天&#xff0c;我…

Altium Designer (AD) 绘制原理图及双层PCB简易教程

目录 前言 工程建立 创建工程 创建原理图文件 创建PCB文件 绘制原理图 导入元件库 ​编辑绘制原理图 设置原理图标注 ​编辑​编辑 结果图​编辑 制作PCB板 生成PCB​编辑 绘制PCB边缘 设置PCB网格间距大小 走线规则设置 修改安全间距 什么是安全间距 怎样修…

在飞机设计中的仿真技术

仿真技术在飞机设计中发挥着越来越重要的作用&#xff0c;本文阐述了国内外在飞机设计中广泛使用的结构强度计算&#xff0c;多体动力学仿真、多学科多目标结构优化、内外流场分析、非线性有限元分析、疲劳强度分析、电磁仿真分析&#xff0c;机电液联合仿真分析等&#xff0c;…

数据结构基础5:栈和队列的实现。

一.栈的基本概念。 一.基本概念 1.基本概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&…

java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

java静默打印PDF可实现生产环境下服务器写入PDF模板&#xff0c;然后调用客户端打印机打印 一、简需求实现步骤 二、代码实现0、打印模板1、服务器部分 &#xff08;端口&#xff1a;8090&#xff09;1.1、maven依赖1.2、实体1.2.1、接口返回类1.2.2、标签纸页面参数类1.2.3、P…

【EI/SCOPUS检索】第四届应用力学与机械工程国际学术会议(ICAMME 2023)

第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09; 2023 4th International Conference on Applied Mechanics and Mechanical Engineering (ICAMME 2023) 第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09;将于2023年11月10…

期刊和会议缩写查询网站

1.https://pubmed.ncbi.nlm.nih.gov/?termMedicalImageComputingandComputer-AssistedIntervention 2. http://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 3. https://blog.csdn.net/weixin_44557349/article/details/120825927 https://blog.csdn.net/ret…

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

【solon生态】- solon.cloud.micrometer插件使用指南及micrometer详解

solon.cloud.micrometer插件使用指南 solon是什么solon的cloud生态图快速入门 micrometer指南micrometer是什么监控系统 Supported Monitoring Systems注册表 Registry度量 Meters度量名 Naming Meters度量标签 Tag Naming通用标签 Common Tags 指标过滤器 MeterFilter聚合速率…

LeetCode_01 精度丢失

1281. 整数的各位积和之差 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 …

vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

问题描述 vue2中refs获取不到子组件中的方法&#xff1f;&#xff0c;而获取到的是undefined 原因及解决方案&#xff1a; 第一种、在循环中注册了很多个ref 因为注册了多个ref&#xff0c;获取是不能单单知识refs.xxx&#xff0c;需要使用数组和索引来获取具体一个组件refs[…