输出单链表中倒数第k个结点(Java版)

题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。


解题思路:
如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,求出它的结点的总个数n(包括头结点),所以单链表的结点是从倒数第n-1个到倒数第0个,然后再遍历一次单链表,遍历时访问的第n-k-1个结点就是该单链表中倒数第k个结点。现在要求只能遍历一次单链表,可以设两个指针p和q,最开始时它们都指向头结点,然后p向后移动k位,最后p,q同时向后移动直到p为最后一个结点,那么此时q即为所求。


ADT定义:
[java] view plain copy
//单链表的结点类  
class LNode{  
    //为了简化访问单链表,结点中的数据项的访问权限都设为public  
    public int data;  
    public LNode next;  
}  


算法实现:
[java] view plain copy
public class LinkListUtli {  
    //求单链表倒数第k个结点,尾指针为倒数第0个结点  
    public LNode reciprocalKNode(LNode L, int k) {  
        if (k < 0) {  
            System.out.println("k不可以为负数");  
            return null;  
        }  
        if (L == null) {  
            System.out.println("单链表为空");  
            return null;  
        }  
        LNode p = L;  
        LNode q = L;  
        while (k > 0) {  
            p = p.next;  
            if (p == null) {  
                System.out.println("单链表太短,不存在倒数第k个结点");  
                return null;  
            }  
        }  
        while (p.next != null) {  
            p = p.next;  
            q = q.next;  
        }  
        return p;  
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值