样例
给出链表 1->2->3->3->4->5->3 , 和 val = 3 , 你需要返回删除3之后的链表:1->2->4->5 。
以上是LintCode上给出的样例.
首先,对删除整体进行分析。
将链表删除划分成两块,删除头结点以及删除中间节点。
removedElements(ListNode * head,int val)函数中,先对头节点进行判断,如果为空,则直接返回NULL。
其次判断头节点是否是要是所要删除的节点,如果是则将第二个节点的内容赋值给头节点。以此类推,直到头节点不再是所要删除的节点,或者头节点为NULL停止。要注意的是当“第二个节点”为空时,用*p = *p->next语句会出现错误,因此要对“第二节点”进行判断,如果为空则直接返回NULL。
最后,是对中间节点进行删除操作
如 p->next = p->next->next;
ListNode * removeElements(ListNode * head, int val)
{
// write your code here
if(head == NULL)
{
return NULL;
}
while(head->val == val)
{
if(head->next == NULL)
return NULL;
*head = *(head->next);
}
ListNode *p = head;
while(p->next != NULL)
{
if(p->next->val == val)
{
p->next = p->next->next;
}
else
{
p = p->next;
}
}
return head;
}
}; 以上是省略了释放内存的代码。
ListNode * removeElements(Node *head, int val)
{
ListNode *ptemp = NULL;
while(head->val == val)
{
if(head->next == NULL)
return NULL;
ptemp = head->next;
*head = *(head->next);
free(ptemp);
ptemp = NULL;
}
ListNode *p = head;
while(p->next != NULL)
{
if(p->next->val == val)
{
ptemp = p->next;
p->next = p->next->next;
free(ptemp);
ptemp = NULL;
}
else
{
p = p->next;
}
}
return head;
}
|