原来我一直理解的都是错误的
在单链表的删除操作中,除设p指向删除节点,要另外设一个pp指向p的父节点了,因为若令p指向删除的节点,p=p->next,那么pp->next的值并没有改变,
//等价于p=q,p++,可是q的值是不会变的
template<class T>
Chain<T>& Chain<T>::Delete(int k, T& x)
{
if (k < 1 || !first) return *this;
chainNode<T> *p = first;
//考虑删除头结点的情况
if (k == 1) // p already at k'th
first = first->next; // remove
else {
// use q to get to k-1'st
chainNode<T> *q = first;
for (int index = 1; index < k - 1 && q;index++)
q = q->next;
//q为空,链表长度不及K
if (!q || !q->next)
return *this;
p = q->next; // k'th
q->next = p->next;
} // remove from chain
// save k'th element and free node p
x = p->data;
delete p;
return *this;
}