• 查找和删除倒数第n个节点的问题


     1 class ListNode
     2 {
     3     int val;
     4     ListNode next;
     5     ListNode(int x)
     6     {
     7         val = x;
     8     }
     9 }
    10 public class NthNodeFromEnd {
    11      public ListNode removeNthFromEnd(ListNode head, int n) 
    12      {
    13          ListNode p = head;
    14          ListNode q = head;
    15          for(int i = 0; i < n ; i++)
    16          {
    17              p = p.next;
    18          }
    19          if(p == null)//如果p==null,说明倒数第n个就是第一个节点,即头结点。
    20          {
    21              head = head.next;
    22              return head;
    23          }
    24          while(p.next != null)
    25          {
    26              p = p.next;
    27              q = q.next;
    28          }
    29          if(q.next != null)
    30          {
    31              q.next = q.next.next;
    32          }
    33          
    34          return head;
    35      }
    36      public ListNode removeNthFromEnd2(ListNode head, int n) 
    37      {
    38         //因为要删掉倒数第n个节点,那就必须找到倒数第n+1个节点
    39         //如果倒数第n正好是头结点,那么头结点前面没有节点了很麻烦,我们可以设置一个节点作为头结点之前的节点
    40         //设置一个头结点,这样就不用单独对原始头结点处理了
    41          ListNode dumy = new ListNode(0);
    42          dumy.next = head;
    43          ListNode p = dumy;
    44          ListNode q = dumy;
    45          for(int i = 0; i < n; i ++)
    46          {
    47              p = p.next;
    48          }
    49          while(p.next!=null)
    50          {
    51              p = p.next;
    52              q = q.next;
    53          }
    54          q.next = q.next.next;
    55          return dumy.next;
    56      }
    57      //找倒数第n个节点
    58      public ListNode findNthFromEnd(ListNode head, int n)
    59      {
    60          ListNode p = head;
    61          ListNode q = head;
    62          for(int i = 0; i < n-1; i ++)
    63          {
    64              p = p.next;
    65          }
    66          while(p.next!=null)
    67          {
    68              p = p.next;
    69              q = q.next;
    70          }
    71          return q;
    72      }
    73      
    74      public static void main(String[] args)
    75      {
    76          NthNodeFromEnd rn = new NthNodeFromEnd();
    77          ListNode n1 = new ListNode(1);
    78          ListNode n = rn.removeNthFromEnd(n1, 1);
    79          System.out.println(rn.findNthFromEnd(n1, 1).val);
    80          if(n == null)
    81          {
    82              System.out.println(n);
    83          }
    84          while(n!= null)
    85          {
    86              System.out.println(n.val);
    87              n = n.next;
    88          }
    89      }
    90 }
  • 相关阅读:
    Eureka集群----SpringCloud 微服务
    Eureka----SpringCloud 微服务
    SpringCloud 微服务
    yml在线格式转换工具(properties)
    Spring与Mybatis三种整合方法
    Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
    Spring事务配置的五种方式
    Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
    Spring -- <context:component-scan>使用说明
    web.xml执行顺序
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5540562.html
Copyright © 2020-2023  润新知