剑指offer15 链表中倒数第k个结点

Posted 去做点事情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer15 链表中倒数第k个结点相关的知识,希望对你有一定的参考价值。

错误代码

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead == NULL || k == 0)
            return NULL;
        ListNode* p1 = pListHead;
        ListNode* p2 = pListHead;
        for(int i = 1;i < k;i++){
            p1 = p1->next;
        }
        while(p1->next != NULL){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};

会报“段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起”

因为k的数字可能大于整个链表的长度,这时p1可能指向空指针,空指针的next就会报错

如果去计算一遍整个链表的长度,再判断k与链表长度的大小,这样还是会和笨办法一样遍历两次链表,直接在for循环里添加判断条件只遍历一次链表

 

正确代码

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead == NULL || k == 0)
            return NULL;
        ListNode* p1 = pListHead;
        ListNode* p2 = pListHead;
        for(int i = 1;i < k;i++){
            p1 = p1->next;
            if(p1 == NULL){
                return NULL;
            }
        }
        while(p1->next != NULL){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};

 

以上是关于剑指offer15 链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章

[剑指offer]面试题15:链表中倒数第k个结点

剑指Offer面试题15(Java版):链表中倒数第K个结点

Java 剑指offer(22) 链表中倒数第k个结点

剑指offer:链表中倒数第k个结点

剑指offer链表中倒数第k个结点

链表中倒数第k个结点-剑指Offer