【剑指offer56 删除链表中重复的节点】
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
注意如果是头结点的判断
另外,每次->next的时候都需要判断当前节点是否为空
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(!pHead || !pHead->next) return pHead; ListNode *pre = pHead; //指向前面最晚访问过的不重复结点 ListNode *left = pHead; //指向当前处理的结点 ListNode *right = NULL; //指向当前处理结点后面结点 while( left != NULL ) { //当前结点left,(其实是left指向当前结点),与它下一个结点val相同,说明要删掉有这个val的所有结点 if( left->next && left->next->val == left->val ) { right = left->next; //找到最后一个需要删除的节点 right while( right && right->next && right->next->val == left->val ) { right = right->next; } //如果left指向链表中第一个元素,left -> ... -> right ->... , 将指向链表第一个元素的指针pHead指向right->next。 if( left == pHead ) { pHead = right->next; } else//如果left不指向链表中第一个元素,head -> pre->left ->...->right ->... 即pre->next = right->next { pre->next = right?right->next:NULL; } //当前处理的left要更新 left = right->next; //即pre->next } else //left下一个和left不相同 { pre = left; left = pre->next; //一定不能写成right->next } } return pHead; } };