维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡。

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

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

分析:
可以扫描两次,第一次获取总长度,知道倒数第N是正数第几个,第二次扫描真正的找到节点删除。

如何扫描一次呢?

可以使用数组(集合),将所有节点地址存入ArrayList中,根据n找到正数的编号,直接编号前一个next指向编号后一个节点,最终返回头即可,当然要考虑特殊情况比如删除头之类。实现代码:

public ListNode removeNthFromEnd2(ListNode head, int n) {        List<ListNode>list=new ArrayList<ListNode>();ListNode team=head;while (team!=null) {list.add(team);team=team.next;}list.add(null);if(list.size()==n)return head.next;if(list.size()<1)return null;int index=list.size()-1-n;list.get(index-1).next=list.get(index+1);return head;   }

还可以怎么考虑?

用两个指针,一个先走N步,然后两个同时向下寻找。一直到右侧的到最尽头即可找到待删除节点。

这样删除并不方便,在具体操作上,要找到待删除的前一个节点,用这个节点删除他的后面节点。而如果待删除的是头节点可能还需要特殊讨论,为了避免这种情况,我们可以使用一个头节点放在最前侧,这样就可以把链表中每一个节点都当作普通节点来处理。

具体代码为:

 public ListNode removeNthFromEnd(ListNode head, int n) {        ListNode value=new ListNode(0);value.next=head;head=value;ListNode team=value;for(int i=0;i<n;i++){team=team.next;}while (team.next!=null) {team=team.next;head=head.next;}if(head.next!=null)head.next=head.next.next;return value.next;   }

20 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

分析:
括号类的问题是经典栈类问题,肯定要想到用栈处理。判断一个字符串满不满足一个有效的字符串,就要看它是不是都能组成对。

  • 从单个对来说,((,))都是不满足的,只有()才可满足,即一左一右。
  • 从多个对来说{[(字符串还可接受任意无限([,{的括号。但是只能接收)的向左的括号。

从上面可以看作一种相消除的思想。例如(({[()()]}))字符串遍历时候可以这样处理:

  • (({[(下一个)消掉成(({[
  • (({[(下一个)消掉成(({[
  • (({[下一个]消掉成(({
  • (({下一个}消掉成((
  • ((下一个)消掉成(
  • (下一个)消掉成`` 这样就满足题意

所以这个过程利用栈判断当前是加入栈还是消除顶部,到最后如果栈为空说明满足,否则不满足,当然具体括号要对应,具体实现代码为:

 public boolean isValid(String s) {Stack<Character>stack=new Stack<Character>();for(int i=0;i<s.length();i++){    char te=s.charAt(i);if(te==']'){if(!stack.isEmpty()&&stack.pop()=='[')continue;else {return false;}}else if(te=='}'){if(!stack.isEmpty()&&stack.pop()=='{')continue;else {return false;}}else if(te==')'){if(!stack.isEmpty()&&stack.pop()=='(')continue;else {return false;}}elsestack.push(te);}return stack.isEmpty(); }


用自带的栈并不是很快,所以我们使用数组模拟栈的实现,这样速度就快了一点:

 public boolean isValid(String s) {char a[]=new char[s.length()];int index=-1;for(int i=0;i<s.length();i++){ char te=s.charAt(i);if(te==']'){if(index>=0&&a[index]=='[')index--;else {return false;}}else if(te=='}'){if(index>=0&&a[index]=='{')index--;else {return false;}}else if(te==')'){if(index>=0&&a[index]=='(')index--;else {return false;}}elsea[++index]=te;}return index==-1; }

结语

原创不易,bigsai请你帮两件事帮忙一下:

  1. star支持一下, 您的肯定是我在平台创作的源源动力。

  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。

记得关注、咱们下次再见!

LeetCode19删除链表的倒数第N个节点20有效的括号相关推荐

  1. 【链表】leetcode19.删除链表的倒数第N个节点(C/C++/Java/Js)

    leetcode19.删除链表的倒数第N个节点 1 题目 2 思路 3 代码 3.1 C++版本 3.2 C版本 3.3 Java版本 3.4 JavaScript版本 4 总结 1 题目 题源链接 ...

  2. 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ

    LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...

  3. LeetCode-19 删除链表的倒数第N个节点

    文章目录 题目描述 我的解法 反思 优化 再次反思 再次优化 总结 Github 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...

  4. leetcode19. 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  5. [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. Leetcode--19. 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  7. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  8. 删除链表的倒数第N个节点—leetcode19

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  9. 刻意练习:LeetCode实战 -- Task11. 删除链表的倒数第N个节点

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

最新文章

  1. 西安java招聘_西安招聘 | 陕西安控科技公司招聘(员工宿舍、节日福利、餐补)...
  2. 网站SEO更新时选择适当的时间点有什么好处?
  3. apache php 调优_Apache的性能优化(二)
  4. 矩阵理论及其应用_有限元分析ansys理论与应用视频第三课 绪论:直接法矩阵求解...
  5. common Lisp学习笔记(十二)
  6. 洛谷 P1162 填涂颜色-dfs染色法
  7. java 运算优先级_Java-运算符优先级
  8. 编译器C-Free V352注册算法分析
  9. 爬虫cookie过期_【Python】Scrapy爬虫框架之Request和Response
  10. android防全家桶html5,不要再用全家桶浏览器了!五款轻量级安卓浏览器,体积小,功能强...
  11. 2021年主流CAD批量打印软件功能对比
  12. windows: 关于MsMpEng.exe导致“弹出USB大容量存储设备时出问题”
  13. 云流化像素流技术解决方案之虚拟仿真系统
  14. 电子设计(1)二极管防电源反接电路
  15. 记一次阴阳师挂机脚本开发
  16. 使用Jmeter做性能测试
  17. Ian Goodfellow回忆GAN诞生故事:几杯啤酒喝出“20年来最酷的深度学习想法”
  18. 模糊查询忽略大小写解决方案
  19. 制作独特彩妆美女模特头像照片的PS教程
  20. 中国分电器及点火线圈市场现状研究分析与发展前景预测报告(2022)

热门文章

  1. java元婴期(22)----java进阶(mybatis(1)---mybatis框架概述入门程序)
  2. 操作系统课设--具有二级索引的文件系统
  3. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  4. 如何写一篇酷炫的博文(博文列表中展现字幕)
  5. Linux Kernel/optee/ATF等操作系统的异常向量表的速查
  6. MySQL的索引及优化方案
  7. C++实现仿射加密法
  8. 设计模式C++实现(8)——代理模式
  9. 4.内核APC执行过程
  10. 7、GRANT:用户授权