题目描述
题目分析
这才是正常的中等题难度嘛,昨天的中等题题解我半天看不懂。。。
首先,需要增加一个哑节点(操作链表的常规操作),因为有可能删除首节点,我们不想要为首节点添加单独的逻辑。其次,用一个变量保存前驱节点,因为删除操作必须要前驱节点,初始化为哑节点。
我的想法是,用一个指针指向一个元素开始的地方,另一个指针指向重复元素结束的地方,如果两个指针相等,说明没有重复元素,则将前驱节点后移,如果不相等,说明需要进行删除。
没有考虑对空间的释放,因为不知道链表是怎样生成的,如果是new
出来的要考虑delete
,否则会出现内存泄漏
看了一下题解,觉得自己的实现方法更加优美。
AC代码
class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode list_head(0, head);ListNode *ahead = &list_head;while (ahead->next != nullptr) {ListNode *begin = ahead->next;ListNode *end = begin;while (end->next != nullptr && end->next->val == begin->val) {end = end->next;}if (begin == end) {//如果没有移动,说明不是重复元素,移动前驱指针ahead = begin;} else {//移动了,说明是重复元素,需要进行删除ahead->next = end->next;}}return list_head.next;}
};