这两个方法也是链表操作中比较常见的方法,但是注意是非尾节点才可以使用替换删除法,替换插入法任何节点均可用!先上代码:
//删除一个无头单链表的非尾节点
void EraseNotTail(pNode pos)
{
pNode pCur = NULL;
assert(pos != NULL);
pCur = pos->next->next;
pos->data = pos->next->data;
free(pos->next);
pos->next = pCur;
}
其实就是本来应该删除pos位置的节点,但是为了方便操作我们只能删除pos后面的节点,于是我们先把pos的next的next节点的位置存储起来,然后将pos的next节点的数据存到pos节点上,接着删除pos的next节点即可:
同样的道理,我们看看替换插入法:
//在无头单链表的一个节点前插入一个节点
void InsertNode(pNode pos, DataType data)
{
pNode pCur = NULL;
pNode newNode = NULL;
assert(pos != NULL);
newNode = BuyNode(pos->data);
if (newNode == NULL)
{
printf("空间不足\n");
return;
}
pCur = pos->next;
pos->next = newNode;
pos->data = data;
newNode->next = pCur;
}
同样的道理,本来我我们应该把新的节点插入到pos之前,但是由于这样是不好操作的,于是我们先把节点插入到了pos的后面,然后交换pos与新节点中的数据,这样便完成了所谓的“在pos之前插入”,优化方案:直接在产生新节点的时候就使用pos的data来构造节点,这样只需要将参数data赋值给pos的data即可!