Java版剑指offer编程题第14题--链表中倒数第k个结点

跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。

  • 不积硅步,无以至千里;
  • 不积小流,无以成江海。

题目描述

no14
Java版剑指offer编程题第14题–链表中倒数第k个结点: 输入一个链表,输出该链表中倒数第k个结点。

我的想法

  • 链表结构没有索引,不能像数组那样直接根据get(index)得到你想要的元素,只能用指针遍历链表,找到相等的了,就返回。如果要解决题目中的问题,需要考虑两点:
  • 首先,要用一个指针遍历一遍链表,获得链表的总结点数size
  • 知道了总节点数,那么倒数第k个结点实际上就是正数第(size-k+1)个结点。也就是说再用一个指针从前往后遍历到第(size-k+1)个结点就行了。
  • 等第一个指针走完了,第二个指针再开始行动,有点浪费时间,能否改变第二个指针的时间,使得第一个指针遍历完链表后,第二个指针恰好就走到了倒数第二个节点
  • 很简单呀,第一个指针先走k个节点,第二个指针就开始跟着走,这样当第一个指针遍历完链表后,第二个指针恰好走到倒数第k个节点

解题方法1

    public static List_Node FindKthToTail(List_Node head,int k) {
        List_Node p, q;
        p = q = head;
        int i = 0;
        for (; p != null; i++) {
            //老二让老大先走k步
            if (i >= k)
                q = q.next;
            p = p.next;
        }
        //防止参数k超出范围
        return i < k ? null : q;
    }

代码测试

package com.learnjiawa.jzoffer;

import java.util.ArrayList;

/**
 * @author learnjiawa
 * 2019-12-13-8:52
 */
public class Solution14 {
    public static void main(String[] args) {
        List_Node listNode1 = new List_Node(1);
        List_Node listNode2 = new List_Node(2);
        List_Node listNode3 = new List_Node(3);
        List_Node listNode4 = new List_Node(4);
        List_Node listNode5 = new List_Node(5);

        listNode1.add(listNode2);
        listNode2.add(listNode3);
        listNode3.add(listNode4);
        listNode4.add(listNode5);
        List_Node temp = listNode1;
        System.out.println("创建链表如下:");
        while(temp != null){
            System.out.print(temp + " ");
            temp = temp.next;
        }
        System.out.println(" ");
        int k = 2;
        System.out.println("倒数第"+k+"个阶点是:");
        System.out.println(FindKthToTail(listNode1, k));

    }
    public static List_Node FindKthToTail(List_Node head,int k) {
       List_Node p, q;
        p = q = head;
        int i = 0;
        for (; p != null; i++) {
            if (i >= k)
                q = q.next;
            p = p.next;
        }
        return i < k ? null : q;
    }
}

class List_Node {
    int val;
    List_Node next = null;
    List_Node(int val) {
        this.val = val;
    }
    public void add(List_Node listnode){
        this.next = listnode;
    }

    @Override
    public String toString() {
        return "List_Node{" +
                "val=" + val +
                '}';
    }
}


代码测试控制台输出结果
no14Result

总结

链表查找元素的题目,比较简单,其实也可以用空间换时间,将链表每个节点存到数组里面,按索引返回结点值,不过这里给出的节法更好,速度快,并且不会改变节点。

参考文献

[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.

更多

对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava:
LearnJava

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值