链表oj (环形链表oj)

文章目录

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 herestruct 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 herestruct 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.hqwc.cn/news/59289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDFS中的Trash垃圾桶回收机制

Trash垃圾桶回收机制 文件系统垃圾桶背景功能概述Trash Checkpoint Trash功能开启关闭HDFS集群修改core-site.xml删除文件到trash删除文件跳过从trash中恢复文件清空trash 文件系统垃圾桶背景 回收站&#xff08;垃圾桶&#xff09;是windows操作系统里的一个系统文件夹&#…

C++进阶 智能指针

本篇博客简介&#xff1a;介绍C中的智能指针 智能指针 为什么会存在智能指针内存泄露内存泄漏定义内存泄漏的危害如何检测内存泄漏如何避免内存泄漏 智能指针的使用及其原理RAII设计一个智能指针C官方的智能指针 定制删除器智能指针总结 为什么会存在智能指针 我们首先来看下面…

SpringBoot 底层机制分析[上]

文章目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器】[上]搭建SpringBoot 底层机制开发环境Configuration Bean 会发生什么&#xff0c;并分析机制提出问题&#xff1a;SpringBoot 是怎么启动Tomcat &#xff0c;并可以支持访问C…

剑指Offer12.矩阵中的路径 C++

1、题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

配置Hive远程服务详细步骤

HiveServer2支持多客户端的并发和认证&#xff0c;为开放API客户端如JDBC、ODBC提供了更好的支持。 &#xff08;1&#xff09;修改hive-site.xml&#xff0c;在文件中添加以下内容&#xff1a; <property><name>hive.metastore.event.db.notification.api.auth&l…

药库管理指南:除了药物质量,这个技能很关键

随着医疗技术的不断进步&#xff0c;药品的质量要求也日益严格&#xff0c;药物的稳定性、疗效以及避免细菌滋生等方面都直接受到温湿度变化的影响。 药品质量和安全是医疗行业的首要任务之一&#xff0c;药库温湿度监控在此过程中发挥着关键作用。通过科学合理地实施温湿度监控…

Q-Vision+Kvaser CAN/CAN FD/LIN总线解决方案

智能联网技术在国内的发展势头迅猛&#xff0c;随着汽车智能化、网联化发展大潮的到来&#xff0c;智能网联汽车逐步成为汽车发展的主要趋势。越来越多整车厂诉求&#xff0c;希望可以提供本土的测量软件&#xff0c;特别是关于ADAS测试。而Softing中国推出的Q-Vision软件不仅可…

不看后悔一辈子!不看错过50K!历尽心血总结Redis全局命令

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的敖云岚&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏&#xff1a;Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c…

CS录屏教程,录制游戏需要注意哪些方面?

​最近有个CS手游的玩家小伙伴咨询想要做一些游戏视频录制&#xff0c;但是不知道有哪些好用的工具来使用&#xff0c;对于游戏录制我们其实是需要注意一些事项的&#xff0c;想要观众的观感上比较好就需要把握好视频的帧率等问题&#xff0c;下面我们就来看看录制方法和需要注…

opencv基础40-礼帽运算(原始图像减去其开运算)cv2.MORPH_TOPHAT

礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息&#xff0c;或者得到比原始图像的边缘更亮的边缘信息。 例如&#xff0c;图 8-22 是一个礼帽运算示例&#xff0c;其中&#xff1a; 左图是原始图像。中间的图是开运算图像。右图是原始图像减开运…

Salesforce 助理认证和管理员认证有何区别?备考者应如何选择?

随着Salesforce生态系统对专业人员的需求不断增长&#xff0c;获得相关认证对于寻求职业发展的从业者来说至关重要。 对于刚接触Salesforce平台的人而言&#xff0c;Salesforce助理认证和Salesforce管理员认证是两个比较基础的认证。这两个认证有什么区别呢&#xff1f;从业者…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…