首页 > 代码库 > 剑指offer15 链表中倒数第k个结点

剑指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个结点