替换删除法与替换插入法

这两个方法也是链表操作中比较常见的方法,但是注意是非尾节点才可以使用替换删除法,替换插入法任何节点均可用!先上代码:

//删除一个无头单链表的非尾节点 
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即可!

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81184159