HJ51 输出单向链表中倒数第k个结点

题目:

HJ51 输出单向链表中倒数第k个结点

题解:

一、构建链表+顺序访问

  1. 顺序构建链表
  2. 获取链表长度n
  3. 倒数k = 顺序的 n-k
  4. 依次遍历链表元素获取第 n-k 个节点值
    public int getLastKNode(List list, int k) {
        int length = 0;
        ListNode temp = new ListNode();
        ListNode head = temp;

        for (Integer value : list) {
            ListNode listNode = new ListNode(value);
            temp.next = listNode;
            temp = listNode;
            length++;
        }

        int index = length - k;
        head = head.next;
        while (index > 0) {
            head = head.next;
            index--;
        }

        return head.value;
    }

时间复杂度:O(2n)

二、快慢指针

  1. 快指针先走k个节点
  2. 当快指针走完第k个节点,慢指针开始走
  3. 当快指针走到链表结尾,慢指针对应的节点就是倒数第k个节点
    public int getLastKNode(List list, int k) {
        ListNode temp = new ListNode();
        ListNode slow = null;
        for (int i = 0; i < list.size(); i++) {
            ListNode listNode = new ListNode(list.get(i));
            temp.next = listNode;
            temp = listNode;
            if (i == 0) {
                slow = listNode;
            }
            if (i > k-1) {
                slow = slow.next;
            }
        }

        return slow.value;
    }

时间复杂度:O(n)

你可能感兴趣的:(链表,快慢指针)