思路:
我们要保证返回的元素没有重复的,也就是每个元素在最后返回时只可以出现一次;
由于题目中的链表为有序链表,所以我们在遍历的过程中,该元素如果和前一个不一样,那么就说名这是我们第一次遇到,也就是我们要将它留下来;
首先我们要先判断链表是否为空
(这点很关键,在我们平时做题的时候要下意思的去留意一下)
如果链表为空,我们直接返回就行;
if (!head) {
return head;
}
然后我们要创建一个结构体指针变量,并让它指向我们的头节点,接下来我们就要判断该变量所指向的节点的数据域与下一个节点的数据域是否相等,但前提是下一个节点为非空;
如果相等,我们就将该节点的指针域赋值为后两个节点的位置;
如果不相等,我们就将该节点往后移一位;
if (cur->val == cur->next->val) {
cur->next = cur->next->next;
} else {
cur = cur->next;
}
这里我们要注意的是,
cur->next = cur->next->next;
这一步只是将该节点的指针域赋值为往后两个节点的位置;
但此时该节点自身的位置并没有改变;
cur = cur->next;
这一步才是改变了节点的位置;
最后,我们返回即可;
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (!head) {
return head;
}
struct ListNode* cur = head;
while (cur->next) {
if (cur->val == cur->next->val) {
cur->next = cur->next->next;
} else {
cur = cur->next;
}
}
return head;
}
思路:
由于本题要求我们只留下不同的数字,想要做到这一点,也就是我们要保证该节点的数据域与前一个节点的数据域和后一个节点的数据域均不相同(题目给出是有序链表);
一定不要忘记判断链表是否为空!!!
首先,我们要想办法让该节点与其前一个节点和后一个节点发生联系,所以我们就创建一个虚拟头节点,该头节点的指针域指向第一个节点的位置;
然后我们还要创建一个结构体指针用来保存该头节点的位置;
额...懒得写了,直接看代码吧
struct ListNode* deleteDuplicates(struct ListNode* head){
if (head==NULL){
return head;
}
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = head;
struct ListNode* n = p;
struct ListNode* q = head;
while(q){
while(q && p->next->val == q->val){
q = q->next;
}
if (p->next->next == q){
p = p->next;
}else {
p->next = q;
}
}
return n->next;
}