需要两个移动指针,一个带领连接点进行连接,一个负责寻找不重复点。需要一个头指针指明链表开始节点。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* vHead = new ListNode(0);//链表指针
vHead->next = head;
ListNode* mov = head;//不重复点查找
ListNode* con = vHead;//连接点控制
while (mov && mov->next) {
if (mov->next->val != mov->val) { //检测fast指向的节点是否重复
con = mov; //不重复,slow往前一步
mov = mov->next;
} else {
int repeatVal =
mov->val; //记录重复的值,让fast跳过全部值相同的节点
while (mov && mov->val == repeatVal) {
mov = mov->next;
}
con->next = mov; //注意此时mov指向的节点仍可能重复,所以con不动
}
}
return vHead->next;
}
};