Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例
示例1:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
难度:简单
此题为简单题,兄弟们可以重拳出击!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 链表中倒数第 k 个节点,由于链表的特点,可以正向寻找而不能倒序寻找,因此想要寻找倒数第 k 个节点并不十分简单。
- 可以先进行以此链表的遍历,记录链表中节点的总数量 n,然后进行第二次链表遍历,遍历到 n-k +1 个就是倒数第 k 个节点。
- 还可以使用双指针解法,此种解法对于链表这种单向结构十分好用
- 首先定义一个快指针在链表中先移动 k 次
- 然后定义一个慢指针,与快指针同步移动
- 当快指针移动到最后时,慢指针指向的结点就是倒数第 k 个结点
三、AC 代码
快慢指针
- 链表种倒数第k个节点,使用双指针(速度相同,距离相差k),第一个先走 k 步,然后一起走
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode quick = head, slow = head;
for(int i = 0; i < k; i++){
quick = quick.next;
}
while(quick != null){
quick = quick.next;
slow = slow.next;
}
return slow;
}
四、总结
知识点
- 双指针一般指左右指针或快慢指针,可以根据不同题目进行选择
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。