删除单链表中所有值为x的元素

删除所有值为x的单链表中的元素

首先,我们先考虑第一种情况,就是说值删除第一个值为x的元素,这个比较简单,

只需要挨个比较x和链表节点的值,找到值相同的节点的前一个就可以删除这个节点了。

然后我们可以考虑两种办法第一种就是递归的去删除,这个比较简单,只需要删除第一个值和我们要删除的值一样的节点,然后把下一个节点当做头指针传先去就好了。

这个就不给与代码了。我把头删的代码也贴上来。

void DeleteHead( PNODE* phead)
{
	if( NULL != *phead )
	{
		PNODE pDelete = *phead;
		*phead = (*phead)->next;
		delete pDelete;
		pDelete = nullptr;
	}
}

那么,我们来考虑一下非递归的方法吧。

PNODE DeleteByValue( PNODE* pHead, int val )
{
	PNODE p1,p2;
	PNODE pos;

	pos = *pHead;
	while( (*pHead) != NULL && (*pHead)->val == val )
	{
		DeleteHead(pHead);
	}

	if( NULL != *pHead )
	{
		p1 = *pHead;
		p2 = (*pHead)->next;
		while( p2 != NULL )
		{
			while( p2 != NULL && p2->val == val )
			{
				p1->next = p2->next;
				delete p2;
				p2 = NULL;
				p2 = p1->next;
			}
			if(p2 == NULL )
			{
				break;
			}
			p1 = p1->next;
			p2 = p2->next;
		}
	}	
	return *pHead;

}

作为一个程序员应该是可以看懂这些代码的。首先,我们做了一个判断头结点的值是否和我们要删除的值相等,我们一直删除到第一个节点的值不和我们要删除的节点相等为止。首先,我们判断链表是否还有节点,如果有,我们维护两个指针,一个指向头结点,一个指向第二个节点,首先,这里有一个问题就是第一个指针指向的头结点一定不会被删除,因为前面已经删除了头结点的值一样的情况。所以我们在第二个指针不是空的前提下判断第二个节点的值是否和我们的值一样就可以了。如果,我们的第二个指针和要删除的值一样了那么删除第二个节点。首先,将第一的节点的下一个指向第二个节点的下一个。然后删除第二个节点。接着我们把第二个指针的值赋为第一的next,然后一直删除到第二个节点也不一样为止。这样就删除了一段值和我们要删除的相同的情况了。然后判断第二个指针是不是空了。空了 就退出。不空的后移。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值