剑指 Offer 22------链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
/**
* @author LanceQ
* @version 1.0
* @time 2021/4/25 15:06
* 链表中倒数第k个节点
*/
public class BottomOfNumber {
public static void main(String[] args) {
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
ListNode e = new ListNode(5);
a.next = b;
b.next = c;
c.next = d;
d.next = e;
int k=3;
ListNode ln=FindKthToTail(a,k);
System.out.println(ln);
}
private static ListNode FindKthToTail(ListNode l1,int k) {
if(l1==null||k<=0){
return null;
}
ListNode pre=l1;
ListNode curr=l1;
//记录移动的次数
int count=0;
//存在倒数的位置
int n=k;
while (pre!=null){
pre=pre.next;
count++;
if (n<1){
curr=curr.next;
}
n--;
}
if(count<k)
return null;
return curr;
}
}
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val+"->"+next;
}
}
3->4->5->null
总结:
- 如果链表为空或者k小于等于0,就返回null。
- 声明两个指向头结点的节点。
- 创建一个count用于记录节点移动的次数
- 把k值授予n
- pre指针先跑,并且记录节点数,当pre节点跑了k-1个节点后,curr节点开始跑,当pre节点跑到最后时,curr节点所指的节点就是倒数第k个节点
- 如果"count<k",就表示节点个数小于所求的倒数第k个节点,则返回空。
参考:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/