首页 > 代码库 > 剑指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个结点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。