题目

  1. 例如 1-2-3-4 删除21-2-3-4-5 删除3
  2. 例如 a=1,b =2

java代码

  1. /**
  2. * @Description:删除中间节点和a/b处节点
  3. * @Author: lizhouwei
  4. * @CreateDate: 2018/4/6 10:12
  5. * @Modify by:
  6. * @ModifyDate:
  7. */
  8. public class Chapter2_3 {
  9. //删除中间节点
  10. public Node removeMidNode(Node head) {
  11. if (head == null || head.next == null) {
  12. return null;
  13. }
  14. Node node1 = head;
  15. Node node2 = node1.next.next;
  16. //获取中间节点的前驱节点 ,因为让node2早走一步,当node2走完时,node1刚好是中间节点的前驱节点
  17. while (node2.next != null && node2.next.next != null) {
  18. node1 = node1.next;
  19. node2 = node2.next.next;
  20. }
  21. node1.next = node1.next.next;
  22. return head;
  23. }
  24. //删除a/b处的节点
  25. public Node removeNodeByRatio(Node head, int a, int b) {
  26. if (head == null) {
  27. return null;
  28. }
  29. Node cur = head;
  30. int len = 0;//节点长度
  31. while (cur != null) {
  32. len++;
  33. cur = cur.next;
  34. }
  35. //边界检查
  36. if (a < 0 || b <= 0) {
  37. return head;
  38. }
  39. int k = (int)Math.ceil((double)(a* len)/(double)b);
  40. //如果k==1 说明a/b处是头节点
  41. if (k == 1) {
  42. head = head.next;
  43. }
  44. if(k>1){
  45. cur =head;
  46. //提前减一,这样当k=1时,节点为 k处的前驱节点
  47. while (--k!=1){
  48. cur = cur.next;
  49. }
  50. cur.next = cur.next.next;
  51. }
  52. return head;
  53. }
  54. public void printLink(Node head) {
  55. System.out.println();
  56. while (head != null) {
  57. System.out.print(head.vlaue + " ");
  58. head = head.next;
  59. }
  60. }
  61. //测试
  62. public static void main(String[] args) {
  63. Chapter2_3 chapter = new Chapter2_3();
  64. Link link1= new Link();
  65. Link link2= new Link();
  66. //构造两个链表
  67. for (int i = 10; i >0 ; i--) {
  68. link1.add(i);
  69. link2.add(i);
  70. }
  71. chapter.printLink(link1.head);
  72. Node head1= chapter.removeMidNode(link1.head);
  73. chapter.printLink(head1);
  74. chapter.printLink(link2.head);
  75. Node head2= chapter.removeNodeByRatio(link2.head,1,2);
  76. chapter.printLink(head2);
  77. }
  78. }

《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点的更多相关文章

  1. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  2. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  3. 《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris

    题目 遍历二叉树的神级方法 morris java代码 package com.lizhouwei.chapter3; /** * @Description:遍历二叉树的神级方法 morris * @ ...

  4. [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序

    题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...

  5. 左神算法书籍《程序员代码面试指南》——2_03删除链表的中间节点和a/b处的节点

    [题目]给定链表的头节点head,实现删除链表的中间节点的函数.例如:不删除任何节点:1->2,删除节点1:1->2->3,删除节点2:1->2->3->4,删除节 ...

  6. 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节

    [题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...

  7. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  8. 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】

    [问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...

  9. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

随机推荐

  1. rational rose画UML图

    原文见:http://blog.csdn.net/cjr15233661143/article/details/8532997 UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统 ...

  2. 使用svn 在 github上下载单个文件夹?

    事实上可以用svn checkout 下来的.(但就是速度不知道为啥那么慢) 第一步:输入你的仓库地址 第二步:选择thunk,然后仓库的内容尽收眼底.接下来就可以选择你想下载的任意文件夹了. (如果 ...

  3. oracle复合索引的选择和使用

    声明:虽然题目是Oracle.但同样适合MySQL InnoDB索引          在大多数情况下.复合索引比单字段索引好     很多系统就是靠新建一些合适的复合索引.使效率大幅度提高      ...

  4. poj 2367

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3658   Accepted: 2433 ...

  5. sublime使用技巧(2)-- 实用插件推荐【持续更新】

    1.Auto semicolon 在括号内输入分号,会自动把光标移到行尾然后再输入分号. 2.DocBlockr 补全注析格式,例如在函数上面输入/** + Enter,就会自动补全函数的注析说明. ...

  6. js判断对象的属性是原型的还是实例的

    一些情况下,我们需要知道对象的属性是原型的还是实例的,如果看代码的话比较繁琐,下面讲解下如何可以直接判断 1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的 ...

  7. 移动端实用的meta标签

    直接上代码,代码自有颜如玉 代码自有黄金屋啊 <meta http-equiv="Content-Type" content="text/html; charset ...

  8. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  9. vue2+element组件库开发

    Vue2:https://cn.vuejs.org/v2/guide/single-file-components.html element组件库:http://element-cn.eleme.io ...

  10. VS2019取消git源代码管理

    VS2019->工具->选项->源代码管理->插件管理 详见下图