剑指offer-链表中倒数第k个结点
2018-03-31 16:42
351 查看
求链表的倒数第K个节点:主要思路设置两个指针,刚开始都指向链表的第一个节点,第一个指针先走k-1步,然后两个一块走,直到第一个指针的下一位为nullptr,则第二个指针所指的位置就是倒数第k个节点。 在编程书上看见这个方法,自己画了个链表试了试果然是这样,但是这是个什么原理呢? 想了想是这样的耶。。。分为两种情况:1、倒数第k个位置在正数第k个位置之后,如图:
此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。 然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到second_end,second_end即是倒数第k个位置。first和second走过的长度都是蓝色区域加黄色区域的长度。 2、倒数第K个位置在正数第K个位置之前,如图:
此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。 然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到 second_end,second_end即是倒数第k个位置。first和second走过的长度都是黄色区域的长度。 其实还有第三种情况:就是比较特殊的-k=+k的情况,即倒数第k个位置就是正数第k个位置(中间位置),但这种情况可以归类为以上两种情况的任意一种,不做特殊处理。 故可以简单的写出代码:注意事项:1、要是K大于链表长度怎么办? 2、k<=0怎么办?
/*
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;
int dump = k-1;
while(dump!=0){
p1 = p1.next;
if(p1==null)
return null;
dump--;
}
while(p1.next!=null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}
此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。 然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到second_end,second_end即是倒数第k个位置。first和second走过的长度都是蓝色区域加黄色区域的长度。 2、倒数第K个位置在正数第K个位置之前,如图:
此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。 然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到 second_end,second_end即是倒数第k个位置。first和second走过的长度都是黄色区域的长度。 其实还有第三种情况:就是比较特殊的-k=+k的情况,即倒数第k个位置就是正数第k个位置(中间位置),但这种情况可以归类为以上两种情况的任意一种,不做特殊处理。 故可以简单的写出代码:注意事项:1、要是K大于链表长度怎么办? 2、k<=0怎么办?
/*
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;
int dump = k-1;
while(dump!=0){
p1 = p1.next;
if(p1==null)
return null;
dump--;
}
while(p1.next!=null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}
相关文章推荐
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 每日AC-剑指Offer 链表中倒数第k个结点
- 剑指Offer13 链表倒数第K个结点
- 【剑指offer】链表中倒数第K个结点
- 剑指offer:输入一个链表,输出该链表中倒数第k个结点。
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 链表中倒数第k个结点[剑指offer]之python实现
- 剑指offer题解 链表中倒数第k个结点
- 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ
- 剑指offer-3-面试15:链表中倒数第k个结点
- (十)剑指offer之链表中倒数第k个结点
- 剑指Offer学习之面试题15 :链表中倒数第k个结点
- 剑指 offer:链表中倒数第k个结点
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
- 剑指offer_链表中倒数第k个结点
- 剑指Offer-链表中倒数第k个结点
- [剑指offer]链表中倒数第k个结点
- 剑指offer 输出链表倒数第k个结点
- 剑指Offer - 九度1517 - 链表中倒数第k个结点
- 剑指offer:输出该链表中倒数第k个结点