zoukankan      html  css  js  c++  java
  • "Coding Interview Guide" -- 删除链表的中间节点和a/b处的节点

    题目

      给定链表的头节点head,实现删除链表的中间节点的函数

      例如:1,不删除任何节点;

                     1->2,删除节点1;

           1->2->3,删除节点2;

           1->2->3->4,删除节点2;

           1->2->3->4->5,删除节点3;

     1     public Node removeMidNode(Node head)
     2     {
     3         if(head == null || head.next == null)
     4         {
     5             return null;
     6         }
     7 
     8         if(head.next.next == null)
     9         {
    10             return head.next;
    11         }
    12 
    13         Node pre = head;
    14         Node cur = head.next.next;
    15         while(cur.next != null && cur.next.next != null)
    16         {
    17             pre = pre.next;
    18             cur = cur.next.next;
    19         }
    20         pre.next = pre.next.next;
    21         return head;
    22     }

    总结】 

     1 N:链表长度
     2 #1 
     3     pre = head;
     4     cur = head;
     5     当N为偶数时,找到的节点为N/2 6     当N为奇数时,找到的节点为N/2 + 1;
     7 
     8 #2
     9     pre = head;
    10     cur = head.next;
    11     当N为偶数时,找到的节点为N/212     当N为奇数时,找到的节点为N/213 
    14 #3
    15     pre = head;
    16     cur = head.next.next;
    17     当N为偶数时,找到的节点为N/2 - 1;
    18     当N为奇数时,找到的节点为N/2;(#3找到的是#1找到的节点的前一个节点)

    题目

      给定链表的头节点head、整数a和b,实现删除位于a/b处节点的函数

      例如:

        链表:1->2->3->4->5,假设a/b的值为r

        如果r等于0,不删除任何节点;

        如果r在区间(0, 1/5]上,删除节点1;

        如果r在区间(1/5, 2/5]上,删除节点2;

        如果r在区间(2/5, 3/5]上,删除节点3;

        如果r在区间(3/5, 4/5]上,删除节点4;

        如果r在区间(4/5, 1]上,删除节点5;

        如果r大于1,不删除任何节点

    分析

      (int) Math.ceil((((double) (a * n)) / (double) b)的值即为该删除的节点是链表中的第几个节点

     1     public Node removeByRatio(Node head, int a, int b)
     2     {
     3         if(a < 1 || a > b)
     4         {
     5             return head;
     6         }
     7 
     8         int n = 0; 
     9         Node cur = head;
    10         while(cur != null)
    11         {
    12             n++;
    13             cur = cur.next;
    14         }
    15 
    16         n = (int) Math.ceil(((double) (a * n)) / (double) b);  // 确定删除的是第n个节点
    17         if(n == 1)
    18         {
    19             head = head.next;
    20         }
    21         if(n > 1)
    22         {
    23             cur = head;
    24             while(--n > 1)
    25             {
    26                 cur = cur.next;
    27             }
    28             cur.next = cur.next.next;
    29         }
    30         return head;
    31     }

    总结

     1 java的Math类中四种静态取整方法:
     2 #1
     3     public static double ceil(double);  // 向上取整
     4 
     5 #2
     6     public static double floor(double);    // 向下取整
     7 
     8 #3
     9     public static double round(double);     // 四舍五入
    10 
    11 #4
    12     public static double rint(double);  // 返回最接近参数的整数,如果有两个数都接近参数,则返回其中的偶数值

    来源:左程云老师《程序员代码面试指南》

  • 相关阅读:
    Vue官方脚手架分环境打包配置及接口环境切换
    JS超全判断终端
    H5与APP(安卓及IOS)交互方法
    json数据扁平化处理(适用于接口传参复杂数据加密处理)
    VUE实践经典记录(持续更新)
    Javascript 词法分析
    三栏自适应布局
    前端神器 Firebug 2.0 新特性一览
    事件绑定(终极版)
    正则表达式(下)
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/11012091.html
Copyright © 2011-2022 走看看