一、题目
二、思路
(1)使用哨兵节点,省去首个元素的逻辑判断,最后返回dummy->next。
(2)比较cur.next与cur.next.next对应的元素是否相同。
(3)因为给定的链表已经是排好序了,我们只需要一次遍历即可(不需要遍历2次,用哈希)。
链表的题通常需要注意两点:
(1)舍得用变量,千万别想着节省变量,否则容易被逻辑绕晕
(2)head 有可能需要改动时,先增加一个 假head,返回的时候直接取 假head.next,这样就不需要为修改 head 增加一大堆逻辑了。
三、代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if(!head) return head; ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* cur = dummy; while(cur->next && cur->next->next){ if(cur->next->val == cur->next->next->val){ //删除后一个和后面元素 int x = cur->next->val; //循环删除 while(cur->next && cur->next->val == x){ //删除cur->next元素 cur->next = cur->next->next; } }else{ cur = cur->next; } } return dummy->next; } };