码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-07-15 13:22:48      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

思路 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 removeLastKthNode(Node head,int lastKth){
        
        if(head == null || lastKth < 1){
            return head;
        }
        
        Node p = head;
        while(p != null){
            lastKth--;
            p = p.next;
        }
        
        if(lastKth == 0){
            head = head.next;
        }
        
        if(lastKth < 0){
            p = head;
            while(++lastKth != 0){
                p = p.next;
            }
            p.next = p.next.next;
        }
        return head;
    }

 

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

标签:

原文地址:http://www.cnblogs.com/janenan/p/5672925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!