解题思路:
(1)我是使用了三个指针ppre,pre,q,分别表示前前指针、前指针、当前指针
(2)使用pre->val==q->val,q=q->next来消除相同的元素,ppre表示相同元素之前的那个指针
(3)每次pre变为NULL时,表明还是没有找到头指针
(4)建议使用和牛客网相同的g++或gcc版本,不然高版本的编译器不报错,但是通不过牛客网!!!
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
ListNode* ppre=NULL,*pre=NULL,*q = pHead;
ListNode* head = NULL;
while(q) {
if(pre==NULL) {
pre=q;
head = pre;
q=q->next;
} else {
if(pre->val==q->val) {
while(q!=NULL && pre->val==q->val) {
q = q->next;
}
pre = ppre;
if(pre==NULL) {
pre=q;
head = pre;
if(q!=NULL) q=q->next;
} else pre->next = q;
} else {
ppre = pre;
pre = q;
q = q->next;
}
}
}
return head;
}
};
本文详细解析了一种高效的链表去重算法,通过使用三个指针ppre、pre、q,有效地移除了链表中所有重复的元素。文章深入探讨了算法的实现细节,包括如何利用指针定位重复元素并进行删除,以及如何处理头指针的特殊情况。此外,还特别提醒读者注意编译器版本对代码执行的影响。
&spm=1001.2101.3001.5002&articleId=105832691&d=1&t=3&u=310a5c30c85a46f5819c925e0c1be8b5)
1173

被折叠的 条评论
为什么被折叠?



