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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法总结之 在单链表和双链表中删除倒数第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;
         
         
    }
    
    
    
}

 

以上是关于算法总结之 在单链表和双链表中删除倒数第k个节点的主要内容,如果未能解决你的问题,请参考以下文章

2.2 在单链表和双链表中删除倒数第K个节点

编程12:在单链表和双链表中删除倒数第K个结点

链表问题----删除倒数第K个节点

链表中删除倒数第K个节点

单链表和双链表中节点删除的时间复杂度

数据结构之链表(JAVA)