¥剑指offer 22¥链表中倒数第k个结点(的两种解法)

题目描述

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

如果该链表长度小于k,请返回空。

方法一 :返回正数len+1-k

方法二: 双指针解法

     /*
      初始:快慢指针都等于head
      准备:快指针前进k,慢指针前进1
      过程:快慢指针分别前进1,faster.next=null时,慢指针所指向的就是倒数第k个结点,
      返回慢指针
      */

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */
public class Solution {
//方法一
//        public ListNode FindKthToTail (ListNode pHead, int k) {
//         int count =0;
//         ListNode temp = pHead;
//         int len = leng(pHead);
//            if(len<k||k==0)
//                return null;
//         while(temp!=null){
//             count++;
//             if(count==len+1-k){
// //                 temp.next = temp.next.next;
// //                 break;
//                 return temp;
//             }
//            temp = temp.next;
              
//         }
//         return pHead;
//     }
//     public int leng(ListNode pHead){
//         int len =0;
//         while(pHead!=null){
//             len++;
//             pHead=pHead.next;
//         }
//         return len;
//     }
    /*
    双指针法
    */
    public ListNode FindKthToTail (ListNode pHead, int k) {
    ListNode lennode = pHead;//链表长度统计的指针
    ListNode faster = pHead;
    ListNode slower=pHead;
    int len=0;
    while(lennode!=null){//链表长度计算
       len++;
       lennode=lennode.next;
     }
     if(len==k)//链表长度=k
         return pHead;
    if(k==0||len==0||len<k)//链表为空,k<1( k从1开始),链表长度<k
        return null;
    while(k!=0&&faster.next!=null){
        faster=faster.next;
        k--;
    }
      /*
      初始:快慢指针都等于head
      准备:快指针前进k,慢指针前进1
      过程:快慢指针分别前进1,faster.next=null时,慢指针所指向的就是倒数第k个结点,
      返回慢指针
      */
    slower=slower.next;
        
    while (faster.next!=null){
        slower=slower.next;
        faster=faster.next;
    }
    return slower;//faster.next==null,返回慢指针
    }
 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值