LintCode入门练习——452. 删除链表中的元素

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 18:54   1863   0

样例

给出链表 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;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP