链表中倒数第k个结点(剑指offer编程题)

题目描述:

输入一个链表,输出该链表中倒数第k个结点。
/*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
本题知识点考察的是链表。
目的:找到某一链表中的倒数第k个节点。
思路: 每向后遍历到一个新结点,就查看此结点后的第k个节点是否为null(空)。

对k分析(三种情况)

  • 如果k等于0,返回空。
  • 如果k大于链表长度,返回空。
  • 如果k小于链表长度,进行查找操作。

本人思路:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode node = null;
        ListNode pre = head;
        int l = 0;//链表长度
        if(k==0)//k等于0,返回空
            return null;
        while(head!=null){//向后遍历结点
            node = head;//当前节点
            pre = head;//往后移k个的节点
            int m = k;
            while(m>0 && pre!=null){
                if(m==1 && pre.next==null)//如果只剩一个元素 ,返回找到元素
                    return node;
                m--;
                pre=pre.next;
            }
            head = head.next;
            l++;
        }
        return l>k?node:null;//k小于链表长度,返回正确值node,否则返回空。
    }
}

网上大神思路很厉害(简洁明了,考虑了各种情况,没有一句多余的代码!)。
(首先定义两个指向链表头的指针p ,q;先令一个指针指向第k节点,然后两个指针同时向后移动,最后p指向的即为倒数第k个节点。当k为零或节点为空返回。):
链接:https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a?f=discussion
来源:牛客网
下面贴出大神代码:

public ListNode FindKthToTail(ListNode head,int k) { //5,{1,2,3,4,5}
        ListNode p, q;
        p = q = head;
        int i = 0;
        for (; p != null; i++) { //先让指针p指向k节点, 然后指针p,q同时后移,直到找到倒数k个节点。
            if (i >= k)
                q = q.next;
            p = p.next;
        }
        return i < k ? null : q;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值