-
两种相同的方法不同的写法产生的问题:
题目:
输入一个链表,输出该链表中倒数第k个结点。 -
写法1:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == nullptr && k<=0)
return nullptr;
ListNode *p=pListHead;
ListNode *q=pListHead;
int i=0;
for(;q!=NULL;i++)//因为q为NULL时才停止,当k为1时,停止条件q指向NULL,p指向倒数第一个节点
{
if(i>=k)
p=p->next; //始终指向倒数第k的节点
q=q->next;//
}
return i<k ?nullptr :p;
}
};
写法二: 思路没有错,为什么会出现段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == nullptr && k<=0)
return nullptr;
ListNode *p=pListHead;
ListNode *q=pListHead;
int i=0;
while(q->next) //停止条件q->next为空
{
if(i<k)//2
i++; //1 2
if(i==k)
p=p->next; //2
q=q->next; //2 3
}
//如果将循环改为如下:将没有错误
/* while(q) //停止条件q->next为空
{
if(i==k)
p=p->next; //2 3
q=q->next; //2 3 4(NULL)
if(i<k)//2
i++; //1 2
}*/
return i<k ?nullptr :p;
}
};
1.将i++放到p=p->next前,这样p和q指向的位置相差k-1;
2.如果将i++放到指针移动之后,p和q相差为k;