题目描述:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
输入:head = [1,1,1,2,3] 输出:[2,3]
解题思路:
由于需要把重复的元素都删除,需要使用两个指针先确定重复元素的区间,另外一个指针来重新连接链表。 pre用来重新连接链表,left确定左端点,right确定右端点。 循环时先要让right移动到第一个不和left->val相等的结点。 如果right == left->next ,即right是left的直接后继,则说明两者之间没有重复元素,可以让pre后移。 如果right != left->next,说明中间有重复的元素,需要把pre->next 指向right,进行下一次循环
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode newHead;
newHead.next = head;
struct ListNode *pre,*left,*right;
pre = &newHead;
while(pre->next)
{
left = pre->next;
right = pre->next->next;
while(right != NULL && left->val == right->val)
{
right = right->next;
}
if(left->next == right)
{
pre = pre->next;
}
else
{
pre->next = right;
}
}
return newHead.next;
}
|