题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题目解答:
方法1:三指针遍历
利用三个指针head
,t1
,t2
,其关系为head->next = t1
, t1->next = t2
。每次判断t1
和t2
值的情况,并进行标记。如果相等,则标记,并删除t1
节点,更新指针;不等时标记为真,则也需要删除t1
节点,因为之前有和t1
相同的数字,并更新指针;其它则直接更新三个指针。
运行时间0ms,代码如下。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
struct ListNode* front = (struct ListNode*)malloc(sizeof(struct ListNode));
front->next = head;
struct ListNode *t1 = head, *t2 = head->next;
head = front;
bool flag = false;
while(t2) {
if(t1->val == t2->val) {
flag = true;
head->next = t2;
}
else if(flag) {
flag = false;
head->next = t2;
}
else
head = t1;
t1 = t2;
t2 = t2->next;
}
if(flag) {
head->next = NULL;
}
free(front);
t1 = front->next;
return t1;
}