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

思路 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;
    }

 

posted @ 2016-07-15 11:16  Janenan  Views(1382)  Comments(0)    收藏  举报