题解 | #删除有序链表中重复的元素-II#
删除有序链表中重复的元素-II
http://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
ListNode* deleteDuplicates(ListNode* head) { // write code here if (!head || !head->next) { return head; } ListNode *p1,*pre,*re, *q; p1 = head; re = q = NULL; pre = NULL; while(p1) { if ((pre && pre->val == p1->val) || (p1->next && p1->next->val == p1->val)) { pre= p1; p1 = p1->next; continue; } if (!re) { re = q = p1; } else { q->next = p1; q= q->next; } pre = p1; p1 = p1->next; q->next = NULL; } return re; }
思路:每个节点判断是否是重复的。如果是重复节点就舍弃,否则连接这个节点。
节点是否重复:需要判断当前节点与前一个节点值是否相等,或者后一个节点值是否相等。只要相等就说明错误,否则是不重复的节点。
核心就是这一段:pre 是前驱节点。 p1是当前节点. p1->next 是后驱节点。
while(p1) { if ((pre && pre->val == p1->val) || (p1->next && p1->next->val == p1->val)) { // 与前驱结点值相等 或者 与后一个节点值相等,说明是重复节点,直接丢弃 pre= p1; p1 = p1->next; continue; } // 到这里说明是非错误节点,直接放到结果链表中 if (!re) { re = q = p1; } else { q->next = p1; q= q->next; } pre = p1; p1 = p1->next; // 注意插入节点后要更新最后节点指向 NULL。 q->next = NULL; }