题目描述:
输入一个链表,输出该链表中倒数第k个结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
本题知识点考察的是链表。
目的:找到某一链表中的倒数第k个节点。
思路: 每向后遍历到一个新结点,就查看此结点后的第k个节点是否为null(空)。
对k分析(三种情况)
- 如果k等于0,返回空。
- 如果k大于链表长度,返回空。
- 如果k小于链表长度,进行查找操作。
本人思路:
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode node = null;
ListNode pre = head;
int l = 0;//链表长度
if(k==0)//k等于0,返回空
return null;
while(head!=null){//向后遍历结点
node = head;//当前节点
pre = head;//往后移k个的节点
int m = k;
while(m>0 && pre!=null){
if(m==1 && pre.next==null)//如果只剩一个元素 ,返回找到元素
return node;
m--;
pre=pre.next;
}
head = head.next;
l++;
}
return l>k?node:null;//k小于链表长度,返回正确值node,否则返回空。
}
}
网上大神思路很厉害(简洁明了,考虑了各种情况,没有一句多余的代码!)。
(首先定义两个指向链表头的指针p ,q;先令一个指针指向第k节点,然后两个指针同时向后移动,最后p指向的即为倒数第k个节点。当k为零或节点为空返回。):
链接:https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a?f=discussion
来源:牛客网
下面贴出大神代码:
public ListNode FindKthToTail(ListNode head,int k) { //5,{1,2,3,4,5}
ListNode p, q;
p = q = head;
int i = 0;
for (; p != null; i++) { //先让指针p指向k节点, 然后指针p,q同时后移,直到找到倒数k个节点。
if (i >= k)
q = q.next;
p = p.next;
}
return i < k ? null : q;
}