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);  // 返回最接近参数的整数,如果有两个数都接近参数,则返回其中的偶数值

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

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/11012091.html
Copyright © 2011-2022 走看看