剑指 14. 代码的鲁棒性 链表中倒数第k个结点

题目描述

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

本人渣渣思路:要求解链表中的倒数第k个结点,可以采用栈先进后出的特点,倒数第k个进栈的话,出栈的时候就是第k个出栈的了

那么一开始就遍历链表,然后将每个结点进栈,在将栈的第k个结点出栈即可



import java.util.Stack;
/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {

/*

#以下为错误代码,为什么会错?值得思考一下

Stack<ListNode> stack=new Stack<ListNode>();
while (head!=null) {
stack.push(head);
head=head.next;
}
if(head == null || k ==0 ||k>stack.size()){
return null;
}
ListNode knode = null;
for(int i = 0; i < k; i++){
knode = stack.pop();
}

return knode;
*/

if(head == null || k ==0 ){
return null;
}

//可以先把链表反转,然后找出第k个
Stack<ListNode> stack = new Stack<ListNode>();
int count = 0;
while(head != null){
stack.push(head);
head = head.next;
count++;
}

if(count < k){
return null;
}

ListNode knode = null;
for(int i = 0; i < k; i++){
knode = stack.pop();
}

return knode;
}
}



牛客大佬的神仙代码

代码思路如下:

两个指针,先让第一个指针和第二个指针都指向头结点,

然后再让第一个指正走(k-1)步,到达第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) {

        if(head==null||k<=0){

            return null;

        }

        ListNode pre=head;

        ListNode last=head;       

        for(int i=1;i<k;i++){

            if(pre.next!=null){

                pre=pre.next;

            }else{

                return null;

            }

        }

        while(pre.next!=null){

            pre = pre.next;

            last=last.next;

        }

        return last;

    }

}


原文地址:https://www.cnblogs.com/Transkai/p/10878128.html

时间: 2024-08-27 05:56:04

剑指 14. 代码的鲁棒性 链表中倒数第k个结点的相关文章

【剑指offer】九,链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 分析:此题为常见的快慢指针问题,java实现时要注意空指针错误以及边界条件.使用两个指针p和q,一个指针先走k-1步,然后第二个指针开始走.当第一个指针指向单链表的最后一个节点时,第二个指针指向倒数第k个节点.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 }

《剑指Offer》题目:链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点. Java代码: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public clas

剑指offer十四之链表中倒数第k个结点

一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了. 三.代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class So

剑指offer【13】- 链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindKthToTail(ListNode head,int k) { 12 13 if(head == null){ 14

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

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 三个特例:如果输入的链表为空:k大于链表的长度:k为0的情况.对于正常情况,设置两个指针分

【剑指Offer】14、链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题解一:栈 1 public static ListNode FindKthToTail(ListNode head,int k) { 2 if(head==null||k<=0){ 3 return null; 4 } 5 Stack<ListNode> stack = new Stack<>(); 6 while (head!=null){ 7 stack.push(head); 8 head=head.next; 9

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

剑指offer | 链表中倒数第k个结点

先做做一些简单题找找手感,还有赞一个牛客的OJ,这样的提交方式很好,ACM那种对输入出处格式对于没有接触过ACM的人来说比较头疼,华为OJ那种格式描述不清楚的就更头疼了,卡在输入输出上就悲剧了,当然,输入输出也是需要了解的. 顺便吐槽一下华为SO挑战赛:题意有模糊的地方,挑战赛的题目没有区分度,作弊监管太松,判分规则未公开说明. 题目描述:输入一个链表,输出该链表中倒数第k个结点. 题目解析:设两个同步后移.相距k的指针就行,前面的指针触底,后面的指针即是倒数k个节点. 代码如下: 1 /* 2

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头