leetcode 删除链表中的重复元素Ⅱ
一个已排序的链表,简化了操作,从头指针开始遍历,只需要判断后面的节点的值是否相等即可。
需要维护三个节点,出现相等时的前一个节点,以及结束相等的情况。
不要纠结于用节点的值去做比较,而是要保存这个值进行比较,就可以少维护一个节点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
if (!head) {
return head;
}
struct ListNode* tmp = malloc(sizeof(struct ListNode));
tmp->next = head;
struct 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->next;
}
} else {
cur = cur->next;
}
}
return tmp->next;
}
首先,创建一个空的头节点,如果下下个节点的值与下个节点的值相等,则保存下个节点的值,并进入循环,删除下个节点,直到下个节点的值与保存的值不相等为止。
如果下个节点的值与下下个节点的值不相等,则将当前节点移动到下一个节点。
结果