当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

输入一个链表,输出该链表中倒数第k个结点。

解法

pre 指针走 k-1 步。之后 cur 指针指向 phead,然后两个指针同时走,直至 pre 指针到达尾结点。

当用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度快一些。

此题需要考虑一些特殊情况。比如 k 的值小于 0 或者大于链表长度。

  1. /**
  2. * @author bingo
  3. * @since 2018/11/21
  4. */
  5. /*
  6. public class ListNode {
  7. int val;
  8. ListNode next = null;
  9. ListNode(int val) {
  10. this.val = val;
  11. }
  12. }*/
  13. public class Solution {
  14. /**
  15. * 找出链表倒数第k个节点,k从1开始
  16. * @param head 链表头部
  17. * @param k 第k个节点
  18. * @return 倒数第k个节点
  19. */
  20. public ListNode FindKthToTail(ListNode head,int k) {
  21. if (head == null || k < 1) {
  22. return null;
  23. }
  24. ListNode pre = head;
  25. for (int i = 0; i < k - 1; ++i) {
  26. if (pre.next != null) {
  27. pre = pre.next;
  28. } else {
  29. return null;
  30. }
  31. }
  32. ListNode cur = head;
  33. while (pre.next != null) {
  34. pre = pre.next;
  35. cur = cur.next;
  36. }
  37. return cur;
  38. }
  39. }

测试用例

  1. 功能测试(第 k 个节点在链表的中间/头部/尾部);
  2. 特殊输入测试(输入空指针;链表的节点总数小于 k;k=0)。

该分类下的相关小册推荐: