您的位置:首页 > 其它

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

2016-04-06 22:19 465 查看
删除所有值为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,然后一直删除到第二个节点也不一样为止。这样就删除了一段值和我们要删除的相同的情况了。然后判断第二个指针是不是空了。空了
就退出。不空的后移。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: