不开心!
链表的题看似简单,但是对于我来说每次都会遇到很多问题。尤其是在判断节点是否为空等临界条件时大脑经常卡壳。我觉得关键还是解决问题的逻辑没有理清,导致在临界条件处思维混乱,一会儿考虑这个点,一会儿又考虑另一个点,极大地影响了解决问题的效率。哎~~~,别人在做这样的题时都很顺畅,为什么我就这么纠结呢。难道真的是脑子不够用吗???这样数据结构的题目都用这么长时间,何谈那些算法题啊!不说了。。。
思路:
用扫描指针cur扫描整个链表,当cur所指值与后一个节点的值相同时,将cur所指节点删除,直到cur节点值与后一个节点值不同为止,可将此过程放在一个循环中实现,循环的结束条件是下一个节点为空或者当前节点值与下一个节点值不同,注意当从循环中退出后cur节点也不能保留。当cur节点与后一个节点值不同时,将cur节点插入到结果链表尾部,用prev指针保存结果链表的尾节点。可设置一个结果链表的虚拟头结点,将第一个节点直接放到此头结点后面,这样不用再判断是否是第一个节点,结果返回时直接将虚拟头结点的下一个节点返回即可。
代码如下:
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if(head == NULL)return head;
//创建虚拟头结点
ListNode dummy(INT_MIN);
ListNode *prev = &dummy;
ListNode *cur = head;
while(cur != NULL)
{
bool flag = false;
//当出现重复节点时逐个删除
while(cur->next && cur->val == cur->next->val)
{
flag = true;
ListNode *temp = cur;
cur = cur->next;
delete temp;
}
//删除重复节点中的最后一个节点
if(flag == true)
{
ListNode *temp = cur;
cur = cur->next;
delete temp;
continue;
}
//当前节点没有重复节点,则将其插入到结果链表的尾部
prev->next = cur;
prev = cur;
cur = cur->next;
}
prev->next = cur;
//返回结果链表的头节点
return dummy.next;
}
};