第13题:取链表中倒数第K个结点

本文介绍了一种高效查找单向链表中倒数第K个结点的方法,通过双指针技巧实现,当链表较短时也能正确处理。提供了完整的Java代码示例及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


欢迎转载,转载请务必注明出处:http://blog.youkuaiyun.com/alading2009/article/details/45037001


第13题:输入一个单向链表,输出该链表中倒数第K个结点。链表的倒数第0个结点为链表的尾指针。


考虑如何在程序执行中保留K这个信息,这儿使用两个坐标,要让这两个坐标之间相距K个距离,于是当前一个坐标到达尾指针时,后一个坐标恰好与尾相距K个结点距离。


代码

package test013;

import test007.Node;

/**
 * Created by cq on 2015/4/11.
 * 第13题:输入一个单向链表,输出该链表中倒数第K个结点。链表的倒数第0个结点为链表的尾指针。
 */
public class Test013 {
    public static Node getLastKNode(Node list, int k){
        if (list == null || k < 0){
            return null;
        }

        Node anchor = list;
        int index = 0;
        while (list != null){
            //在anchor和list之间拉开k个结点的距离
            if (index < k){
                list = list.getNext();
                index++;
                continue;
            }
            anchor = anchor.getNext();
            list = list.getNext();
        }

//        //链表长度不到k
//        if (index < k){
//            anchor = null;
//        }

        return anchor;
    }
    public static void main(String[] args){
        Node list = new Node(5);
        Node node4 = new Node(4);
        Node node3 = new Node(3);
        Node node2 = new Node(2);
        Node node1 = new Node(1);
        list.setNext(node4);
        node4.setNext(node3);
        node3.setNext(node2);
        node2.setNext(node1);

        System.out.println("倒数第2个结点是:"+getLastKNode(list, 2).getData());
        System.out.println("倒数第4个结点是:"+getLastKNode(list, 4).getData());

        System.out.println("倒数第7个结点是:"+getLastKNode(list, 7).getData());
        System.out.println("倒数第10个结点是:"+getLastKNode(list, 10).getData());
    }
}




执行结果

Connected to the target VM, address: '127.0.0.1:2218', transport: 'socket'
倒数第2个结点是:2
倒数第4个结点是:4
倒数第7个结点是:5
倒数第10个结点是:5
Disconnected from the target VM, address: '127.0.0.1:2218', transport: 'socket'

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值