• 算法总结之 在单链表和双链表中删除倒数第k个节点


    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点

    思路:

      如果链表为空,或者k<1 参数无效 

      除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1

       当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可

        如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 

        如果k值<0  重新从头开始走,没移动一步 k值加1   当k值等于0时,停止   移动到的节点就是要删除节点的前一个节点

    废话不多说,上代码!

    package TT;
    
    public class Test85 {
     
          public class Node{
              public int value;
              public Node next;
              
              public Node(int data){
                  this.value = data;
              }
                   
          }
        
    public static Node removeLastKthNode(Node head, int lastKth){
        
        if(head==null || lastKth<1){
            return head;
        }
        Node curNode = head;
        Node cur = head;
        
        while(cur!= null){
            lastKth--;
            cur=cur.next;
        }
        if(lastKth == 0){
            head = head.next;
        }
        if(lastKth<0){
            
            cur = head;
            while(++lastKth !=0){
              cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }
          
          
          
          
          
        
    }

     双链表的问题,几乎与单链表处理如出一辙   要注意last指针的重连即可

    package TT;
    
    public class Test86 {
    
        public class DoubleNode{
            public int value;
            public  DoubleNode last;
            public  DoubleNode next;
            
            public DoubleNode(int data){
                 this.value = data;
            }
        }
        
        
        public DoubleNode removeLastKthNode(DoubleNode head, int lastKht){
             if(head==null || lastKht<1){
                 return head;
             }
             DoubleNode cur = head;
             while(cur!=null){
                 lastKht--;
                 cur = cur.next;
             }
             if(lastKht==0){
                 head=head.next;
                 head.last = null;
             }
             if(lastKht<0){
                 
                 cur = head;
                 while(++lastKht !=0){
                     cur = cur.next;
                 }
                 DoubleNode newNext = cur.next.next;
                 cur.next = newNext;
                 if(newNext != null){
                     newNext.last =cur;
                 }
             }
             
             return head;
             
             
        }
        
        
        
    }
  • 相关阅读:
    IO学习BufferedWriter 规格严格
    Finalization 规格严格
    linux下查看主板内存槽与内存信息 规格严格
    调试JavaScript/VB Script脚本程序(Wscript篇) 规格严格
    ORA01688:unable to extend table name。name partition NAME by NUM in tablespace NAME 规格严格
    Hidden Java 7 Features – SecondaryLoop 规格严格
    Web应用服务器监控 规格严格
    NetBeans 时事通讯(刊号 # 12 Jun 16, 2008)
    NetBeans 时事通讯(刊号 # 12 Jun 16, 2008)
    Win32 DLL的一个调试心得
  • 原文地址:https://www.cnblogs.com/toov5/p/7498693.html
Copyright © 2020-2023  润新知