题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
看到题目,我们直观的想法是从链表头部依次遍历到链表尾端,再从尾端回溯k步。但只有双向链表才可以进行反向回溯,单链表显然是行不通的。求链表倒数第k个结点,相当于求链表正数第(n-k+1)个结点。根据这个思想,我们可以应用典型的快慢指针问题,快指针先走k步,然后慢指针跟上同时向前移动,当快指针走到链表尾部时,慢指针所指即为倒数第k个元素。
图示
(P1:快指针 P2:慢指针)
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
class ListNode{ //定义链表节点
ListNode next;
int val;
public ListNode(ListNode listNode,int val){
this.val=val;
this.next=listNode;
}
public ListNode(){}
}
public class findKthToTail {
//打印链表倒数第k个元素
public ListNode findKthEleToTail(ListNode head,int k){
if (head==null||k<=0){
return null;
}
ListNode ANode=head;
ListNode BNode=null;
for (int i=0;i<k-1;i++){
if (ANode.next!=null){
ANode=ANode.next;
}
else {
return null;
}
}
BNode=head;
while (ANode.next!=null){
ANode=ANode.next;
BNode=BNode.next;
}
return BNode;
}
public static void main(String[] args) {
ListNode first=new ListNode();
ListNode second=new ListNode();
ListNode third=new ListNode();
ListNode fourth=new ListNode();
first.val=1; first.next=second;
second.val=2; second.next=third;
third.val=3; third.next=fourth;
fourth.val=4; fourth.next=null;
int k=2;
findKthToTail test=new findKthToTail();
ListNode node = test.findKthEleToTail(first,k);
System.out.println("倒数第"+k+"个节点为:"+node);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于链表类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢Jerry算法!