这道题目的方法
1.遍历链表 找到当前结点与下一结点相等的节点,并将标记删除flag设置为true
2.然后如果不需要删,则继续向后遍历,同时记录pre指针
3.如果删除:
? ? ? ? 1. 记录cur的值,即删除节点的值val。设置一个删除节点pDel,然后while循环删除,如果待删除节点的值等于记录的val,一直循环
? ? ? ? 2. 循环体内需要记录pDel的下一节点nxt,每次删除pDel后更新nxt
? ? ? ? 3. 如果删除完之后pre为空 说明删除了头结点 因此head=nxt;
? ? ? ? ?4.如果pre不空,则pre->next=nxt
然后cur = nxt///指向第一个不同的元素
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
// write code here
if(!head) return nullptr;
ListNode*cur=head,*pre=nullptr;
while(cur)
{
ListNode* nxt = cur->next;
bool toDel = false;
if(nxt && nxt->val==cur->val)
{
toDel = true;
}
if(!toDel)
{
pre = cur;
cur = cur->next;
}
else
{
ListNode *pDel = cur;
int val = cur->val;
while(pDel && pDel->val==val)
{
nxt = pDel->next;
delete pDel;
pDel = nullptr;
pDel = nxt;
}
if(pre==NULL)
{
head = nxt;
}
else
{
pre->next = nxt;
}
cur = nxt;
}
}
return head;
}
};
|