难度简单776
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2] 输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
官方代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head)
{
if (!head)
return head;
ListNode* p = head;
while(head->next)
{
if (head->next->val == head->val)
{
head->next = head->next->next;
}
else
{
head = head->next;
}
}
return p ;
}
};
没有清除空间操作。
代码清楚,像诗一样。
我的代码
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head)
{
if (!head)
return head;
ListNode* p = head;
while (head)//如果便利还没结束
{
while ((head->next) && head->next->val == head->val) //
{
ListNode* q = head->next;
head->next = head->next->next;
delete q;
}
head = head->next;
}
return p;
}
};
较为复杂,不善于理解
不同
while循环里面一个是head->next;一个是head。
其原因在于如果head->next->val,系统会报错。
但head->next->next不会出问题。
当我们遍历到链表的最后一个节点时,\textit{cur.next}cur.next 为空节点,如果不加以判断,访问 \textit{cur.next}cur.next 对应的元素会产生运行错误。因此我们只需要遍历到链表的最后一个节点,而不需要遍历完整个链表。