输入一个链表,输出该链表中的倒数第k个结点。
思想:
- 双引用遍历,定义两个引用p1,p2,第一个引用比第二个引用先走k步,则p1,p2一直相差k个结点,当p1遍历结束时,p2就是倒数第k个结点。
- 注意存在该链表中可能根本就没有k个结点的情况,此时返回空。
具体实现:
- 如果链表为空,直接返回null;
- 定义变量
(1)定义变量 cur 表示当前变量;cur = head;
(2)进行双引用遍历要定义两个新的引用 p1,p2
p1 = head;
p2 = head; - 让p1先走k个结点
(1)如果原链表中没有k个结点,直接返回null;return null;
(2)如果有大于等于k个结点,p1一直往前走;p1 = p1.next; - p1走过k个结点以后,p1,p2开始同时往前走,即同时进行遍历
(1)遍历的条件是p2为空,即(p1 != null)
(2) p1 = p1.next;
p2 = p2.next; - 遍历结束以后,当前p2的结点就是原链表的倒数第k个结点
直接返回p2
代码实现:
package www.fanfan.com;
/**
* author:kelly_fanfan
*/
public class NoewCode_链表中倒数第k个结点 {
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null){
return null;
}
ListNode p1 = head;
ListNode p2 = head;
for(int i = 0;i < k;i++){
if(p1 == null){
return null;
}else{
p1 = p1.next;
}
}
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}
}