您的位置:首页 > 职场人生

剑指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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: