删除链表中所有重复的结点

删除链表中的结点
题目描述:

在这里插入图片描述

解题思路:
  • 我们现在所要做的就是删除链表中的某个结点,那么,当我们要去删除链表中的某个结点的时候,我们就需要保存我们要删除的这个结点的前驱结点,我们只有把前驱结点保存起来了, 我们才可以完成对一个结点的删除,我们就需要去遍历然后去寻找我们索要删除的结点所处在的位置,以及我们所要删除的结点的前驱结点,就可以完成删除了
  • 代码如下所示:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) 
    {
        //删除链表中的某个结点
        //但是需要注意的一点就是我们所要删除的链表有可能是链表中的首届顶啊
        ListNode *pNewHead=new ListNode(0);
        pNewHead->next=head;
        ListNode *prev=pNewHead;
        ListNode *cur=head;
        while(cur)
        {
            if(cur->val==val)
            {
                prev->next=cur->next;
                break;
            }
            //向后继续去寻找
            prev=cur;
            cur=cur->next;
        }
        return pNewHead->next;
    }
};

删除链表中所有重复的结点

题目描述

在这里插入图片描述

解题思路:
  • 对于删除类的问题需要特别注意的一个点就是链表的头节点,头节点也可能是被删除的结点,所以一般在这种删除类的问题里面,我们都会给出一个伪头结点,为了防止传递二级指针这种复杂的情况出现,首先需要建立一个伪头结点。
  • 接下来,就需要我们去遍历整个链表了,如果说当前节点的值与他的下一个结点的值相等的话,那么他们两个就是都需要被删除的了,为了保证删除之后的链表仍然是相互连接在一起的,我们需要把当前结点的前一个结点和后面值比当前结点大的结点进行项链接,我们要确保当前节点始终与下一个没有重复的结点连接在一起。
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
          if(pHead==NULL||pHead->next==NULL) return pHead;
          else
          {
              //新建一个节点,防止头结点要被删除
              ListNode* newHead=new ListNode(0);
              newHead->next=pHead;
              ListNode* pre=newHead;
              ListNode* p=pHead;
              ListNode* next=NULL;
              while(p!=NULL && p->next!=NULL)
              {
                  next=p->next;
                  if(p->val==next->val)//如果当前节点的值和下一个节点的值相等
                  {
                      while(next!=NULL && next->val==p->val)//向后重复查找
                          next=next->next;
                    pre->next=next;//指针赋值,就相当于删除
                    p=next;
                  }
                  else//如果当前节点和下一个节点值不等,则向后移动一位
                  {
                      pre=p;
                      p=p->next;
                  }
              }
           return newHead->next;//返回头结点的下一个节点
               
          }
    }
};
测试用例
  • 功能测试:重复的结点位于链表的头部/尾部/中部,链表中没有重复的结点
  • 特殊输入测试:指向链表头节点的为nullptr,链表中所有的结点全部都是重复的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值