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

基础算法精讲 08|前后指针|链表

前后指针针对链表
看见删除结点,我们就知道需要有当前结点cur,和前驱结点pre。所以立马用前后指针的思想。

237. 删除链表中的节点

237. 删除链表中的节点

思路

这道题细思极恐:如何让自己在世界上消失,但又不死? —— 将自己完全变成另一个人,再杀了那个人就行了。
简称杀我不死
删除结点不能是最后一个

完整代码

class Solution {
public:void deleteNode(ListNode* node) {node->val = node->next -> val;node->next = node->next->next;}
};

遇到的问题

c++中需要自动释放内存。但力扣里不需要。

19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点

思路

  1. 使用了前后指针。
  2. 设置两个指针pre和cur,让cur开始时比pre快n步,那么只要cur遍历到末尾时,pre指向的就是倒数第n个。但是删除一个结点要知道删除节点的前一个结点,所以我们一开始就让cur比pre快n+1步,这样pre指向倒数n+1个,那就好删除倒数第n个了。
  3. 删除头结点的时候没有前驱结点,使用要设置dummy结点,使得头结点与后面的结点统一。

完整代码

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode dummy(0, head);ListNode *cur = &dummy;ListNode *pre = &dummy;while(n+1>0){cur = cur->next;n--;}while(cur){cur = cur->next;pre = pre->next;}pre->next = pre->next->next;return dummy.next;}
};

83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素

思路

  1. 前后指针。当前后指针

完整代码

class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {//防一手空链表。空链表时ListNode *cur = head->next会报错。if (head == nullptr) return nullptr;ListNode *pre = head;ListNode *cur = head->next;while(cur){if (pre->val==cur->val){pre->next = pre->next->next;cur = cur->next;}else{pre = pre->next;cur = cur->next;}}return head;}
};

82. 删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II

思路

  1. 前后指针删除排序链表中的重复元素。比如1222333==》123
  2. 再设置一个pre指针用来删除结点。
  3. 我犯了一个错误,还在用237.删除链表中的节点中的杀我不死的方法。其实一个前置指针就搞定。杀我不死有局限性不能是最后一个结点被删除,所以不能用这个方法。

完整代码

class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode *dummy = new ListNode(666, head);ListNode *pre = dummy;ListNode *cur = head;if(cur==nullptr||cur->next==nullptr)return cur;while(cur && cur->next){if(cur->val == cur->next->val){while(cur->next && cur->val==cur->next->val)cur->next = cur->next->next;pre->next = pre->next->next;cur = cur->next;}else{pre = pre->next;cur = cur->next;}}return dummy->next;}
};

203.移除链表元素

203. 移除链表元素

思路

移除肯定是前后指针啊

完整代码

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode *dummy = new ListNode(0, head);ListNode *pre = dummy;ListNode *cur = head;while(cur){if(cur->val==val){pre->next = pre->next->next;cur = pre->next;}else{cur = cur->next;pre = pre->next;}}return dummy->next;}
};

3217. 从链表中移除在数组中存在的节点

3217. 从链表中移除在数组中存在的节点

思路

  1. 一个链表一个数组。将数组变成哈希表
  2. 将数组中的元素放入哈希表里面。这样遍历链表元素, 同时if(st.find(p->next->val)!=st.end())。一旦if为true,就移除该节点。
  3. 为什么要用哈希表?因为哈希表的查找是O(1).如果用原来的数组查找是O(n)。

完整代码

class Solution {
public:ListNode* modifiedList(vector<int>& nums, ListNode* head) {/*unordered_map<int,int> st;for(auto c:nums)st[c]++;*/unordered_set<int> st(nums.begin(), nums.end());ListNode *t=new ListNode;t->next=head;ListNode *p=t;while(p->next){/*map的判断条件   st.find(p->next->val)!=st.end()*/if(st.contains(p->next->val))p->next=p->next->next;elsep=p->next;}return t->next;}
};

遇到的问题

unordered_map<int,int> st;for(auto c:nums)st[c]++;

unordered_map是一个无序的容器,key值不能重复,value可以重复。

2487.从链表中移除结点

理解不了,算了算了

1669.合并两个链表

1669. 合并两个链表

思路

太简单了吧

完整代码

class Solution {
public:ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {ListNode *aPre = list1;//找到a前面一个结点for (int i = 0; i < a-1 ;i++){aPre = aPre->next;}//找到list2最后一个结点ListNode *l2_tail = list2;while(l2_tail->next){l2_tail = l2_tail->next;}//找到b后面一个结点ListNode *bNxt = list1;for (int j = 0; j < b + 1;j++){bNxt = bNxt->next;}//合并链表aPre->next = list2;l2_tail->next = bNxt;return list1;}};
http://www.dtcms.com/a/549681.html

相关文章:

  • 16.零基础入门——关于ArcCatalog基本内容介绍
  • 嵌入式 Linux 开发核心流程(含应用运行、联网、内核移植与编译,向内核添加新文件)
  • C#面试题及详细答案120道(41-50)-- 异常处理
  • Shell实用实例1000例3
  • 定制型网站一般价格水利厅网站集约化建设
  • 基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
  • 5-27 WPS JS宏数组元素添加删除应用2
  • 网站字体样式wordpress iis伪静态
  • YouBallin:重塑去中心化创作者平台的声誉体系
  • 云手机存在的意义是什么
  • 360免费wifi安全吗网站建设html代码优化
  • 长安大学门户网站是谁给做的石墨网站开发
  • xtuoj Digit String
  • 【代码随想录算法训练营——Day53】图论——110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长
  • 【代码审计】ECShop_V4.1.19 SQL注入漏洞 分析
  • 桐城市住房和城乡建设局网站广东网广东网站建设
  • 网站后台与前台家具网站开发设计任务书与执行方案
  • 网站的文案物流的网站模板
  • ESP32在arduino环境下的离线安装 -- 理论上多个版本都有效
  • Windows的mklink创建符号链使用方法
  • 小清新网站风格正规接单赚佣金的平台
  • 应用APP开发程序编辑中的数据加密和解密以及签名使用解释技巧
  • Spring Boot3零基础教程,Function 各种写法,笔记97
  • 好文与笔记分享 A Survey of Context Engineering for Large Language Models(上)
  • 贵阳营销型网站建设wordpress用思源黑体
  • ksycopg2实战:Python连接KingbaseES数据库的完整指南
  • mediwiki 做网站做网站有发展吗
  • 如何做网站服务器映射计算机专业学做网站吗
  • 拟人AI GoCap:用机器学习打造真实玩家体验
  • cocos里UV坐标显示取值变化异常问题