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

56 阅读1分钟

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

#include "stdio.h"
struct ListNode *getKthFromEnd(struct ListNode *head, int k) {
  if (k < 0) {
    return NULL;
  }

  struct ListNode *fastNode = head;
  for (int i = 0; i < k; i++) {
    if (fastNode == NULL) {
      return NULL;
    }

    fastNode = fastNode->next;
  }

  struct ListNode *slowNode = head;
  while (fastNode != NULL) {
    fastNode = fastNode->next;
    slowNode = slowNode->next;
  }

  return slowNode;
}
  • 遍历一次是最快的方法,时间复杂度为O(n).
  • 一定要有异常处理,即不core掉的异常处理.
  • 即便返回NULL值也是可以接受的.