删除非尾无头链表
首先要理解什么是无头结点的链表,什么是有头结点的链表,要是连这个都理解错了,就完了:
无头结点的链表:第一个节点既有数据域,又有指针域,是通过一个指向该链表的第一个节点的指针来标记该链表的。
有头结点的链表:第一个节点只有指针域,该指针域存放的是指向链表下一个节点的指针(或NULL),该链表通过头结点来标记。
无奈很多人把无头结点理解为了这样:
然后他就一直想,没有头,怎么能找到该链表啊,一直想,一直想。。。。。。最后还是放弃了,脑海里想着这题出错了吧。
PS:上面两张图片放的是最简单的无头结点的链表和有头结点的链表的形式。
// 删除非尾无头链表
//首先,我们先建立一个节点pCur,令节点pCur指向要删除的节点pos的下一个节点,然后,我们先把pCur的值赋给pos, 然后再删除掉pCur这个节点,
void RemoveNodeNotTail(SListNode *pos)
{
assert(pos != NULL);
SListNode *pCur = pos->pNext;
// 让 pos 的下一个指向 原来下一个的下一个
pos->pNext = pCur->pNext;
pos->data = pCur->data;
free(pCur);
}