哑结点+非递归
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode dummyhead(-101, head);
ListNode* cur = &dummyhead;
while (cur->next != NULL && cur->next->next != NULL) {
if (cur->next->val == cur->next->next->val) {
ListNode* temp = cur->next;
while (temp != NULL && temp->next != NULL && temp->val == temp->next->val) {
temp = temp->next;
}
cur->next = temp->next;
}
else {
cur = cur->next;
}
}
return dummyhead.next;
}
};
解题思路
首先创建一个dummy,因为可能存在删除头节点,减少了边界判断。
创建cur指向链表的头部dummy,不断遍历cur,判断cur的next与next的next是否相等,避免空指针产生异常,设置循环的条件就是两者都不能为空。
若两者相等,则创建一个临时的节点储存cur下一个节点的值,然后判断temp以后的节点是否相等,若相等就不断后移,直到不满足条件,即temp的下一个节点与temp不相等,此时将cur的next指向temp的next,就将所有值为temp的节点全部断开了,如果不满足相等条件的,继续向后遍历即可。最终返回dummy的next节点。