14.链表中倒数第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<1){
            return null;
        }
        ListNode cur=head;
        while(cur!=null){
            k--;
            cur=cur.next;
        }

        if(k>0){ //1->2->3,k=4,k的变化:3,2,1,大于0,没有倒数第k个节点
            return null;
        }else if(k==0){ //1->2->3,k=3,k的变化:2,1,0,等于0,就是头节点
            return head;
        }else{ //k<0,1->2->3,k=2,k的变化:1,0,-1,小于0
            cur=head;
            while(++k!=0){
                cur=cur.next;
            }
            return cur.next;
        }
    }
}

方法二:

/*
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<1){
            return null;
        }
        ListNode pre=head;//快指针
        ListNode last=head;//慢指针
        for(int i=1;i<k;i++){
            if(pre.next!=null){//快指针先走k步
                pre=pre.next;
            }else{
                return null;
            }
        }
        while(pre.next!=null){//当快指针走到头的时候,慢指针指向倒数第k个节点
            pre=pre.next;
            last=last.next;
        }
        return last;
    }
}

快慢指针

原文地址:https://www.cnblogs.com/chanaichao/p/10121882.html

时间: 2024-11-08 16:55:49

14.链表中倒数第k个结点的相关文章

剑指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

牛客(14)链表中倒数第k个结点

// 题目描述 // 输入一个链表,输出该链表中倒数第k个结点. public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public static ListNode FindKthToTail(ListNode head,int k) { Stack<ListNode> listNodeStack = new Stack<ListNode>();

剑指 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 c

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

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

高质量代码-链表中倒数第k个结点

题目描述: 输入一个链表,输出该链表中倒数第k个结点. 思路: 首先检查参数的合法性,head==null或节点数小于k都直接返回null. 让head先前进k-1步,ans指向头结点,然后head前进一步,ans也前进一步.当head到达最后一个节点时,ans指向倒数k个节点.时间复杂度O(n). 解决: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 thi

【剑指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 }

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

【面试题015】链表中倒数第k个结点

[面试题015]链表中倒数第k个结点    可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指向的就是倒数第K个结点:两个指针的间距保持为k-1: 当我们遍历列表的时候发现用一个指针是解决不了问题的,我们可以尝试用两个指针来解决问题, 一个指针走的比另外一个指针走得快一点,或者先让其中的一个指针走了若干步,然后再让第二个指针来走: kth.cpp: 123456789101112131415