剑指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; } };