题目:
存在一个按升序排列的链表,给你这个链表的头节点 head,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
示例:
输入:head = [1,1,2]
输出:[1,2]
解题思路:
要删除重复元素,我们需要记录节点的上一节点,所以采用双指针的解法,定义两个指针p和pre都从链表head开始,在后面遍历数组的过程中,使得pre记录p的前一个节点,当遇到p->val与其前一个节点的值比较,当p->val==pre->val时,删除当前节点,删除后结束本次循坏,继续遍历链表,删除其他重复元素。
代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr){//判空,
return nullptr;
}
ListNode *p=head;
ListNode *pre=head;
while(p){
if(p->val==pre->val){//节点p的值与其前一个节点的值相等
pre->next=p->next;//删除当前节点
p=p->next;//继续遍历
continue;//结束本次循环,不执行后面语句
}
pre=p;//使pre作为p的前一个节点
p=p->next;//继续遍历
}
return head;
}
};
时间复杂度:O(n),n是链表中节点的个数
空间复杂度:O(1)