题目来自剑指Offer之十五。

链表结点结构

  1. class ListNode{
  2. int value;
  3. ListNode next = null;
  4. public ListNode(int value){
  5. this.value = value;
  6. }
  7. }

基本解法

  • 遍历两次,第一次确定链表长度,第二次返回第n-k+1个结点,即为所求
  • 注意k不能超过链表长度,代码中要进行判断

  1. public static ListNode findKthToTail(ListNode head,int k){
  2. if(head == null || k <= 0 ){
  3. return null;
  4. }
  5. ListNode node = head;
  6. int nodesNum = 1;
  7. while(node.next != null){
  8. nodesNum++;
  9. node = node.next;
  10. }
  11. node = head;
  12. int count = 1;
  13. while(k <= nodesNum && count != nodesNum - k + 1){
  14. count++;
  15. node = node.next;
  16. }
  17. if(k <= nodesNum){
  18. return node;
  19. }
  20. return null;
  21. }

高效解法

  • 前后指针,前指针先走k-1个结点,从第k个结点开始,后指针也跟着走
  • 当前指针的next为null时,此时后指针所在的位置就为链表的第k个结点
  • 同样注意还没走到第k个结点链表就结束的情况

  1. public static ListNode findKthToTail2(ListNode head,int k){
  2. if(head == null || k <= 0)
  3. return null;
  4. ListNode pre = head;
  5. ListNode behind = null;
  6. for(int i = 0; i < k - 1; i++){
  7. if(pre.next != null){
  8. pre = pre.next;
  9. }else{
  10. return null;
  11. }
  12. }
  13. behind = head;
  14. while(pre.next != null){
  15. pre = pre.next;
  16. behind = behind.next;
  17. }
  18. return behind;
  19. }
  20. <p></p>