在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表
1->2->3->3->4->4->5 处理后为 1->2->5
题解
这题看似很简单,但是务必考虑如下情形:
- 1->1
- 1->1->2->2
- 1->2->2->3->3
- 空链表
另外,遍历链表千万不要为了简洁写成for循环!我因为这个出了bug,看了很久才看出来。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { ListNode* dedup(ListNode* head) { int val = head->val; while (head && head->val == val) { head = head->next; } return head; } public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead == NULL) return NULL; ListNode *p = pHead, *pBefore = NULL; while (p != NULL) { if (p->next && p->next->val == p->val) { if (pBefore) { pBefore->next = dedup(p); p = pBefore->next; continue; } else { pHead = dedup(p); p = pHead; continue; } } pBefore = p; p = p->next; } return pHead; } };
|