1、删除单向链表中的某个节点,比如删除第3个节点,如下图所示:
2、为了便于说明,将节点的位置 作为 节点的数据值。由图可知,要删除第3个节点,只要先使第2个节点指向第4个节点,构成一个新的链表1 -> 2 -> 4;接着释放第3个节点就可以了。
3、具体实现函数代码:
tagNode* DeleteNode(tagNode *pHead, int location)
{
tagNode *pNewHead = NULL; // 新的头结点
tagNode *pTemp = pHead; // 临时节点
tagNode *pDel = NULL; // 待删除节点
int nCount = 1;
if (pHead == NULL)
{
printf("链表为空!\n");
return pHead;
}
// 如果要删除的是头结点(location == 1)
if (location == 1)
{
pNewHead = pTemp->pNext;
free(pTemp);
if (pNewHead == NULL)
{
return NULL;
}
else
{
return pNewHead;
}
}
nCount++;
// 删除非头结点
while (pTemp)
{
if(location == nCount)
{
pDel = pTemp->pNext;
pTemp->pNext = pTemp->pNext->pNext;
free(pDel);
return pHead;
}
else
{
pTemp = pTemp->pNext;
nCount++;
}
}
printf("位置%d处无节点!\n", location);
return pHead;
}
或
void DeleteNode(tagNode **pHead, int location)
{
tagNode *pNewHead = NULL; // 新的头结点
tagNode *pTemp = *pHead; // 临时节点
tagNode *pDel = NULL; // 待删除节点
int nCount = 1;
if (pHead == NULL)
{
printf("链表为空!\n");
return;
}
// 如果要删除的是头结点(location == 1)
if (location == 1)
{
pNewHead = pTemp->pNext;
free(pTemp);
if (pNewHead == NULL)
{
*pHead = NULL;
}
else
{
*pHead = pNewHead;
}
return;
}
nCount++;
// 删除非头结点
while (pTemp)
{
if(location == nCount)
{
pDel = pTemp->pNext;
pTemp->pNext = pTemp->pNext->pNext;
free(pDel);
return;
}
else
{
pTemp = pTemp->pNext;
nCount++;
}
}
printf("位置%d处无节点!\n", location);
}
4、几个注意点:
一、判断待删除的节点是否为头结点;
二、注意传入的位置值(location)是否有效;
三、注意链表节点只有一个时的情况。
5、main函数中调用:
int _tmain(int argc, _TCHAR* argv[])
{
tagNode *p = NULL;
p = CreateLinkedList();
int location;
printf("\n\n遍历:\n");
TraverseNodes(p);
printf("\n\n请输入待删除的节点位置:");
scanf("%d", &location);
getchar();
//p = DeleteNode(p, location);
DeleteNode(&p, location);
printf("\n\n遍历:\n");
TraverseNodes(p);
FreeLinkedList(p);
getchar();
return 0;
}
6、运行结果: