剑指offer-14.链表中倒数第k个结点(Java)

题目描述

输入一个链表,输出该链表中倒数第k个结点。

方法一

【解题思路】
循环两次。第一次统计链表总数n
第二次倒数第k个,即输出正数第n-k+1个
特殊情况:k>n时,返回null

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p = head;
        ListNode q = head;
        int count =  0;    
        
        //统计结点个数
        while(p!=null){
            count++;
            p = p.next;            
        }
        
        //注意!!k>链表总数时,返回空=null
        if(k>count){
            return null;
        }
        
        //倒数第k个,即正数第count-k+1
        count = count - k + 1 ;        
        
        //再次循环,输出第count个,这里注意循环条件
        int m = 1;        
        while(m<count){           
            q = q.next;
            m++;
        }        
        return q;                
    }
}

时间复杂度:O(n)
空间复杂度:O(1)

方法二

【解题思路】
快慢指针。
初始化:快指针 i 指向 正数 第k+1个结点,慢指针 j 指向第一个结点
两个指针同时向前移动,当快指针 i 指向空的时候,慢指针正好指向倒数第k个指针。
特殊情况:链表为空,或者k大于链表总个数

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p = head; //快指针
        ListNode q = head; //慢指针
        
        k = k+1;
        int count = 1;
        
        //快指针指向第k+1个,注意循环条件
        while(count < k){
            if(p == null)
                return null;
            count++;
            p = p.next;             
        }
        
        while(p!=null)
        {
            p = p.next;
            q = q.next;
        }   
             
        return q;                
    }
}

时间复杂度:O(n)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值