给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
分析:这种题一般分为两种实现,一种构建一个新的链表,一种是原地操作。
如果用构建一个新链表的方式,假设链表是[n1, n2, n3 ... null],需要从头遍历找到一段非重复的元素[n1-ni),然后把[n1, ni)用尾插的方式插入到新链表中。然后从ni开始重复上面的操作,直到链表结束,即n1 == null。
如果进行原地操作,同样的,需要记录连续序列的前一个节点current(在数据关系上可以称之为n0),因为做删除操作的时候需要用到,然后同样找重复元素[n1-ni],如果没有找到重复元素,那么前进一步,如果找到了,那么将current的下一个节点直接置为ni,然后继续从ni开始重复执行。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode s(0), *current = &s;
s.next = head;
for (ListNode * next = head; next != NULL;) {
if (next->next == NULL) {
break;
}
int samecount = 0;
ListNode* diff = next->next;
for (;diff != NULL && diff->val == next->val;diff=diff->next, ++samecount);
if (samecount == 0) {
current = current->next;
next = next->next;
} else {
current->next = diff;
next = diff;
}
}
return s.next;
}
};