js 点击最后一个 和倒数第二个_【每日leetcode】链表中倒数第k个节点

小夕的公众号发文方式

  • 由于公众号的改版,如果不经常发文的话,小夕的读者朋友们会收不到小夕的写的文字,因此天天发文就很必要
  • 但小夕的一篇漫画算法原创文章,大概需要5-10个小时的耗时,动画+漫画的那些图片制作起来非常费时间!
  • 所以为了既天天发文,又能保持高质量的漫画算法原创文章的更新,现绝对用如下的发文方式

之前的原创动漫漫画算法文

戳一下即可进行跳转哦~

动漫算法:字节面试题太坑了,刚回答完,就被面试官diss了!

动漫算法:作业帮面试题:求一个数的二进制中1的个数

动漫算法:百度面试题:用两个栈实习一个队列

动漫算法:如何在二维数组中找到一个数?

动漫算法:美团面试题:根据前序序列和中序序列重建二叉树!

动漫算法:美团面试题,将链表逆序存放到数组中

动漫算法:腾讯面试题,请实现把字符串中的空格替换为“%20”

发文方式

  • 小夕会天天更新文章,文章以小夕的每日在算法刷题群公布的题目的题解为主,另外每天小夕会在文章中聊一下在大厂百度(嗯~是的小夕在百度工作)的遇到的问题和一些工作经验(注意这些文章以每天刷题为主,所以这些文章第二天就会删除,所以请紧随小夕的步伐刷题,后续看情况再议,目前是决定当天发文,第二天删文)
  • 小夕的漫画算法原创文章会保持一周1-2篇的更新
  • 这样小夕既能天天发文保持天天更新,又能保证高质量的算法原创文章了~

题目

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

示例:给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof

题解

使用两个指针,一前一后,前面的指针是before 后面的指针是after。before指针先走k步,然后before和after一起走,当before走到null节点时候,那么after节点就是倒数第K个节点。

图解

来源https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/solution/mian-shi-ti-22-lian-biao-zhong-dao-shu-di-kge-j-11/

36fab2b9f329105a671cd8fb29eeb852.png5d0e0f3c4aa95a7773b0f6baa986038e.png41f706c630ea2cc0f68ad5c3581a3429.pnge7ed8e71a332917ee22c566e1ef62e6d.png2ee20fb88c63ac3647dbafa3cedaa9ea.png04d4dd89c1418c27e1a8d93a58e03e2b.png2a585f4ec08e9597b4d203ed9c0669cb.png

Java解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        if(head == null || k 0) return null;
        ListNode before = head;
        ListNode after = head;
        int i = 0;
        while (i // before结点先走k步
            if(before ==null) return null;
            before = before .next;
            i++;
        }
        while(before != null) { // 当before结点走到末尾,那么after结点就是倒数第k个节点!
            before = before .next;
            after = after.next;
        }
        return after;
    }
}

Python解法

# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getKthFromEnd(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        before = head
        after = head
        i = 0
        while(i             before = before.next
            i += 1
        while before:
            before = before.next
            after = after.next
        return after

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        if(!head || k <= 0) return NULL;    //为空返回null
        ListNode *before = head;
        ListNode *after = head;
        while(k--)  
        {
            if(!before)  return NULL;    //当链表的节点不足k个时候 直接返回null
            before = before->next;            //将p移动到第k+1个节点
        }
        while(before)             
        {
            before = before->next;
            after = after->next;
        }
        return after;
    }
};

js


/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var getKthFromEnd = function(head, k) {
    if(head==null || k == 0) return null;
    let before = head
    let after  = head
    let i = 0
    while(i         if(before == null) return null;
        before = before.next
        i++
    }
    while(before) {
        before = before.next
        after = after.next
    }
    return after
};

php

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val) { $this->val = $val; }
 * }
 */
class Solution {

    function getKthFromEnd($head, $k) {
        // 边界情况处理,从而提高代码的健壮性
  if ($head == null || $k == 0) {
   return null;
  }

  $before  = $head;
  $after   = $head;

  // before  提前节点先走k步
  for ($i = 0; $i 1; $i++) {
   if ($before ->next != null) {
    $before  = $before ->next;
   } else {
    return null; // 链表中没有足够的k个节点
   }
  }
  // 提前和落后指针一起走
  while ($before ->next != null) {
   $before  = $before ->next;
   $after   = $after  ->next;
  }
        $head = $after;
        return $head;
    }
}

Go


/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getKthFromEnd(head *ListNode, k int) *ListNode {
    if head == nil || k         return nil;
    }
 var before = head
    var after  = head
 for k>0 {
        if before == nil {
            return nil;
        }
  before= before.Next
  k--
 }
 for before!=nil{
  before = before.Next
  after = after.Next
 }
 return after
}

小夕最后有话说

  • 动画、漫画、加6种编程语言(Java、C++、PHP、GO、Python、JS)的讲解很费心血,希望大家能帮忙转发到朋友圈和身边的朋友,这样小夕的文章能让更多的人看见的话,小夕会更有动力更新文章的呀~
  • 点击阅读原文,查看小夕的leetcode题解,记得点个赞。(leetcode题解可以手动控制动画,更有助于你理解哦~)
  • 公众号后台回复 打卡 查看公众号福利 坚持转发文章到朋友圈,小夕送上100元的红包给你,谢谢铁杆粉丝的支持。
  • 加小夕微信 tiehanhan12342 拉你进算法刷题群。

d60ffb3bc84e5caccd5117159091b6b2.png        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值