删除单链表中倒数第 k 个节点

旧城冷巷雨未停 提交于 2020-03-03 17:18:21

思路 1 :两个指针 p1 ,p2 ,p1从头开始遍历,当 p1 到达第 k 个节点时,p2 开始; 当 P1 到达链表的最后一个节点时,p2 所指的节点则为链表中倒数第 k 个节点。

public class Node{
   
    public int data;
    public Node next;
    
    public Node(int data){
       this.data = data;
    }
    
    public Node removeLastKNode(Node head,int k){
       
       if(head == null || k < 1){
            return head;
       }
       
       Node p1 = head;
       Node p2 = head;
       int num = 1;
       
       while(p1.next != null && num < k){
         ++num;         
         p1 = p1.next;          
       }
       
       while(p1.next != null){
          p1 = p1.next;
          p2 = p2.next;
       }
       
       p2.next = p2.next.next;
       return head;       
    }
}

思路 2:时间复杂度 O(n) ,空间复杂度 O(1)。

1>若链表为空或 K < 1,直接返回;
2>链表从头走到尾,每移动一步,k 值减 1 ;

3>若 k > 0,则没有倒数第 k 个节点,返整个链表;

    若 k = 0,则头结点为倒数第 k 个节点,返回头指针;

    若 k < 0 ,从头遍历寻找要删除节点的前一个节点,每移动一步就让 k 值加 1 ,当 k=0 时,指针值向的节点则为要删除节点的前一个节点。

public Node removeLastKNode(Node head,int k){
        
        if(head == null || k < 1){
            return head;
        }
        
        Node p = head;
        while(p != null){
            k--;
            p = p.next;
        }
        
        if(k == 0){
            head = head.next;
        }
        
        if(k < 0){
            p = head;
            while(++k != 0){
                p = p.next;
            }
            p.next = p.next.next;
        }
        return head;
    }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!