0x01.问题
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
输入示例:1->2->3->3->4->4->5
输出示例: 1->2->5
C++结构体:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
C++函数形式: ListNode* deleteDuplicates(ListNode* head)
0x02.简要分析
链表的基础操作:
- 考虑到头节点和头节点下一个元素可能为空的情况,所以使用哑节点简化代码。
- 删除的核心操作就是每次都从下一个节点开始判断,如果下一个节点的值等于下下个节点的值,就用一个临时指针来不断的往后移,直到没有重复,在把原指针的下一个接到临时指针的下一个,就完成了删除操作。
0x03.解决代码
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode*dummy=new ListNode(0);
dummy->next=head;
ListNode*cur=dummy;
while(cur->next&&cur->next->next){
if(cur->next->val==cur->next->next->val){
ListNode*temp=cur->next;
while(temp&&temp->next&&temp->val==temp->next->val){
temp=temp->next;
}
cur->next=temp->next;
}
else cur=cur->next;
}
return dummy->next;
}
};
ATFWUS --Writing By 2020–03–24