zoukankan      html  css  js  c++  java
  • 算法总结之 在单链表和双链表中删除倒数第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;
             
             
        }
        
        
        
    }
  • 相关阅读:
    浅谈c/c++中的指针问题
    谈谈八大排序算法问题
    隐藏在default construct后面的是什么
    浅谈编译过程和符号表重定位问题
    1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
    成长从今天开始
    正则表达式
    安装RPM包或者安装源码包
    文档的压缩与打包
    文本编辑工具
  • 原文地址:https://www.cnblogs.com/toov5/p/7498693.html
Copyright © 2011-2022 走看看