删除链表中的结点
题目描述:
解题思路:
- 我们现在所要做的就是删除链表中的某个结点,那么,当我们要去删除链表中的某个结点的时候,我们就需要保存我们要删除的这个结点的前驱结点,我们只有把前驱结点保存起来了, 我们才可以完成对一个结点的删除,我们就需要去遍历然后去寻找我们索要删除的结点所处在的位置,以及我们所要删除的结点的前驱结点,就可以完成删除了
- 代码如下所示:
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;
}
};
删除链表中所有重复的结点
题目描述
解题思路:
- 对于删除类的问题需要特别注意的一个点就是链表的头节点,头节点也可能是被删除的结点,所以一般在这种删除类的问题里面,我们都会给出一个伪头结点,为了防止传递二级指针这种复杂的情况出现,首先需要建立一个伪头结点。
- 接下来,就需要我们去遍历整个链表了,如果说当前节点的值与他的下一个结点的值相等的话,那么他们两个就是都需要被删除的了,为了保证删除之后的链表仍然是相互连接在一起的,我们需要把当前结点的前一个结点和后面值比当前结点大的结点进行项链接,我们要确保当前节点始终与下一个没有重复的结点连接在一起。
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,链表中所有的结点全部都是重复的