剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点

Offer 22

常规解法

  • 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可。
package com.walegarrett.offer;

/**
 * @Author WaleGarrett
 * @Date 2021/1/26 20:10
 */

/**
 * 题目分析:
 * 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
 * 例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
 */
/**
 * 解法一:暴力解法,先遍历得出初始链表的长度,然后再次遍历找到指定长度的链表
 */
public class Offer_22 {
    public ListNode getKthFromEnd(ListNode head, int k) {
        int num = 0;
        ListNode current = head;
        while(current != null){
            int val = current.val;
            current = current.next;
            num++;
        }
        current = head;
        int index = 0;
        while(current != null){
            if(index == num - k){
                break;
            }
            index++;
            current = current.next;
        }
        return current;
    }
}

双指针的方法

  • 可以设置一种类似于快慢指针的方法来找到后k个元素,将快慢指针的间隔设置为k,类似于窗口的长度。
  • 当快指针到达链表尾即表示遍历结束,满指针的位置即要求的链表头指针位置。
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode slower = head, faster = head;
        for(int i =0 ;i<k; i++){
            if(faster != null)
                faster = faster.next;
        }
        while(faster != null){
            faster = faster.next;
            slower = slower.next;
        }
        return slower;
    }
}
posted @ 2021-01-26 20:29  Garrett_Wale  阅读(73)  评论(0编辑  收藏  举报