删除单链表的非尾节点(不能遍历链表)
思路:由于单链的的特性,在不遍历链表的情况下,很难找到要删除节点(Cur)的前一个节点(Pre),在删除该节点(Cur)后,没有办法将该节点之前的节点和之后的节点连接起来,因此我们采用替换删除的方法,就是将该节点(Cur)的下一个节点(Next)得到,然后将下一个节点(Next)的值赋给该节点(Cur),再将下一个节点(Next)删除,该节点(Cur)链接上删除节点(Next)的下一个节点(Next->_Next)就完成删除了,这个方法要求要删除的节点不是尾节点。如果是尾节点那该节点(Cur)的下一个节点(Next)为NULL,不能够进行访问,就不能进行赋值,因此不能是尾节点。
代码实现
编译环境:(Visual Studio 2017)
- 函数
void DeleteNonEnd(PNode pos)
{
PNode Del = NULL;
if (NULL != pos->_pNext)
{
Del = pos->_pNext;
pos->_data = Del->_data;
pos->_pNext = Del->_pNext;
free(Del);
}
}
- 测试函数
// 删除单链表的非尾结点 测试
void DeleteNonEnd_test()
{
PNode pHead = NULL;
SListInit(&pHead);//初始化函数
printf("-----非尾节点删除测试-----------------\n");
printf("原始链表: ");
SListPushBack(&pHead, 0);//单链表尾插函数
SListPushBack(&pHead, 1);
SListPushBack(&pHead, 2);
SListPushBack(&pHead, 3);
SListPushBack(&pHead, 4);
SListPrint(pHead);//单链表打印函数
printf("测试结果: ");
DeleteNonEnd(Find(pHead, 2)); //Find() 查找函数
DeleteNonEnd(Find(pHead, 0));
DeleteNonEnd(Find(pHead, 1));
DeleteNonEnd(Find(pHead, 4));
DeleteNonEnd(Find(pHead, 3));
SListPrint(pHead);
printf("\n");
}
以上单链表基础操作函数可以在单链表中找到。
- 测试结果