解题思路:
很简单的遍历,若前后不相等,删除这个节点即可。
解题时存在问题:
- 循环时一直在判断p->next->next存不存在,就潜意识里认为不存在怎么等?看了题解后才想起来,不存在就直接等于nullptr,而下次循环刚好p->next不存在推出循环。
- while里的if有问题,前后相等时删了后面一个结点,但不相等时既满足题目要求时没有变化,导致结点指针p会一直停留在原地不动,无限循环,超时,讲真的,看了半天,是被自己蠢哭的一个早上[doge].
这里是被自己蠢哭的代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode *p = head;
while (p->next) {
if (p->val == p->next->val) {
p->next = p->next->next;
}
}
return head;
}
};
这里是正解:
C++:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode *p = head;
while (p->next) {
if (p->val == p->next->val) {
p->next = p->next->next;
} else {
p = p->next;
}
}
return head;
}
};
第一次用python写数据结构:
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head
cur = head
while cur.next :
if cur.val == cur.next.val:
cur.next=cur.next.next
else:
cur = cur.next
return head