当前位置: 首页 > news >正文

C++ 链表技巧

删除满足某条件的节点

直接遍历比较麻烦,因为头结点和其他节点删除逻辑不同。简单方法:递归、虚拟头结点

直接遍历代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/ListNode* removeElements(ListNode* head, int val) {ListNode* pre = head;ListNode* cur = head;ListNode* new_head = head;while (cur) {if (cur->val == val) {if (cur == new_head) {new_head = cur->next;} elsepre->next = cur->next;ListNode* tem = cur;cur = cur->next;delete tem;} else {pre = cur;cur = cur->next;}}return new_head;
}

递归

时间复杂度:O(n),空间复杂度:O(n)。

ListNode* removeElements(ListNode* head, int val) 
{if (!head) return head;head->next = removeElements(head->next, val);return head->val == val ? head->next : head;
}

虚拟头结点

在头结点前添加虚拟的头结点,统一头结点和其他节点的删除逻辑。时间复杂度:O(n),空间复杂度:O(1)。可能涉及头结点的增删的情况,都可以使用虚拟头结点简化逻辑

ListNode* removeElements(ListNode* head, int val) 
{ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* temp = dummyHead;while (temp->next) {if (temp->next->val == val) {temp->next = temp->next->next;} else {temp = temp->next;}}return dummyHead->next;
}

快慢指针:处理环形链表

快慢指针可用于检测链表中的环,并求出入环的第一个节点。原理:快指针每次移动两步,而慢指针每次只移动一步,当链表中存在环时,快指针与慢指针必定相遇

设第一次相遇,快指针走了2k步,慢指针走了k步,环外长度a, 环长b
快指针多走了n圈(nb) --> k = nb , 慢指针走了nb步。


若慢指针再走a步,则一共走了a+nb步,刚好到达环入口

所以在慢指针和快指针相遇时,再使用一个指针ptr,初始它指向链表头部。随后,它和慢指针每次往后走一步,最后它们会在环入口相遇。

142. 环形链表 II - 力扣(LeetCode),题解代码写得很清楚。

此处,提供另一种解题思路:基于链表从头结点到尾结点依次使用new创建的假设,和堆地址从低到高生长的背景知识,令pre指针为前一节点,cur指针为当前节点。cur-pre>0,说明cur指向的节点在pre后面创建;cur-pre<=0,说明从链表尾部再次入环,且cur为入环的第一个节点。

ListNode* detectCycle(ListNode* head)
{// suppose that all nodes are created in sequence// 堆地址是从低到高生长ListNode* pre = head;if (!head || !head->next)return nullptr;ListNode* cur = head->next;while (cur) {if (cur - pre <= 0)return cur;pre = cur;cur = cur->next;}return nullptr;
}

http://www.dtcms.com/a/487082.html

相关文章:

  • 贪心:Stall Reservations S(重写)
  • 商城网站有免费建设的吗网站开发的主要内容
  • 泉州企业网站设计招商网站建设网
  • 数据库主从同步原理等信息
  • 广西网站建设公司招聘iapp制作软件
  • 人工智能简史(2)
  • 5 网站建设的基本步骤是申请公司邮箱
  • android 16kb 内存适配
  • 数据安全指南-合规治理 2025 等保2.0测评实施 全球数据保护法规对比 数据分类分级管理 ISO27001与SOC2认证 跨境数据传输合规
  • LongVU论文阅读
  • h5游戏免费下载:开心消消乐
  • 做暖暖网站网站建设公司的市场定位
  • (ACP广源盛)DD3118(S)---USB3.0读卡器,支持双卡单待模式,产品规格介绍
  • 特朗普的比特币战略对加密市场周期的影响:从矿业到 Meme 生态的传导机制
  • 江苏省城乡住房建设厅网站模板出售网站源码
  • 你们的LoRaWAN网关能传多远?
  • 腾讯有服务器如何做网站专业网站建设团队
  • 【K8S】学习(一) 基础概念
  • 网站建设公司广告 晴天娃娃政务网站建设建议
  • iOS八股文之 Runtime
  • Transformer ViT 架构(转载)
  • 算法学习 05
  • 注册网站空间邵阳 网站开发 招聘
  • 技术准备一:gflags
  • 高端个性化网站开发如何避免网站被攻击
  • 怎样创建网站或者网址网页设计的模板
  • 深圳网站定制建设网站推广运营
  • 力扣2401. 最长优雅子数组
  • 广州网站设计营销公司中国领导班子级别顺序图
  • 外贸网站建设石家庄烟台网络推广