输入一个 链表 ,输出该链表中倒数第k个节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
分析:
正向的第k个节点比较容易,但是要倒数,所以需要减法来进行操作。链表的减法来说,一般通过双指针来进行操作。先正向再逆向到最后,这样就相当于找到了倒数第k个节点。
算法 流程:
1.初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。
2.构建双指针的距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
3.双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表尾节点时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k 个节点)。
4.返回值: 返回 latter 即可。
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
// 初始化双指针
ListNode former = head, latter = head;
// 正向移动k个距离
for(int i = 0; i < k; i++)
former = former.next;
// 双指针共同移动相同距离, latter 指针相当于走了(长度-k)步长,反过来说来看就是倒数k个步长
while(former != null) {
former = former.next;
latter = latter.next;
}
// 返回结果
return latter;
}
}