剑指offer 面试题57 删除链表中重复的结点
2016-12-18 16:56
441 查看
题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5总结如下:
1.再次强调一个知识点,只要想要移动指针,或者想要访问结点里的内容,一定要先判断是否为空,不然会出现段错误,越界错误.
想要node->next(可以之后判断或者之前判断)或者node->val(一定要访问前判断)的时候
一个技巧:如果报段错误,越界错误,又一时找不到哪里错误,尽管可以找点特殊的实例代进去,就很容易找到了.
2.删除一个指针的时候,一定要立刻赋值为NULL,即使下一行就赋值为其他指针值..养成好习惯.
3.关于本题,想法是要有三个指针,first,second,third
second和third是用来比较是否相等的,first是用来删除second,然后接上后面结点的
由于第一个结点也可能会被比较到相等,但是有没有第一个结点的前一个结点,就是说没有first.所以我在算法中,对于第一个结点,选择独立出来,特殊处理.具体看算法.
ListNode* deleteDuplication(ListNode *pHead) { if(pHead==NULL){ return NULL; } ListNode *first=pHead; ListNode *second=pHead->next; int is_delete_head=0; if(second!=NULL){ if(first->val==second->val){ is_delete_head=1; while(second!=NULL && first->val==second->val){ first->next=second->next; delete second; second=first->next; } } }else{ return first; } while(second !=NULL && second->next!=NULL){ ListNode *third=second->next; if(second->val==third->val){ while(third!=NULL && second->val==third->val){ second->next=third->next; delete third; third=NULL; third=second->next; } first->next=second->next; delete second; second=NULL; second=first->next; }else{ first=second; second=third; } } ListNode *new_head=pHead; if(is_delete_head==1){ new_head=new_head->next; delete pHead; pHead=NULL; } return new_head; }
相关文章推荐
- 剑指offer-面试题57:删除链表中重复的结点
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- (剑指Offer)面试题57:删除链表中的重复结点
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- 剑指offer-面试题57-删除链表中重复的结点
- 剑指offer--面试题57:删除链表中重复的结点
- 剑指Offer系列-面试题57:删除链表中重复的结点
- 面试题57. 删除链表中重复的结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 【剑指Offer学习】【面试题57:删除链表中重复的结点】
- 面试题57:删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 剑指offer面试题57 删除链表中重复的结点
- 《剑指Offer》面试题57:删除链表中重复的节点
- 《剑指offer》:[57]删除链表中重复的结点
- 面试题57 删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 面试题57:删除链表中重复的结点
- 《剑指offer》-删除链表中重复的结点