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、运行结果:

单向链表(二) 删除指定位置的节点_c_02


单向链表(二) 删除指定位置的节点_链表_03


单向链表(二) 删除指定位置的节点_头结点_04


单向链表(二) 删除指定位置的节点_删除节点_05