题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路一(非递归):
先设置一个虚拟结点dummy,使dummy->next = pHead,设置last指针指向dummy,令指针p从链表头开始遍历,当p和p->next的值相等时,用while循环让p指向连续相等的数的末尾的后一位,此时让last指向p,并继续外层循环,当p和p->next不相等时,此时可以确定p所指结点可以保留,则让last指向p,p指向p->next。
代码一:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { ListNode* dummy = new ListNode(-1); dummy->next = pHead; ListNode *last, *p; p = pHead; last = dummy; while(p != NULL && p->next != NULL) { if(p->val == p->next->val) { int val = p->val; while(p != NULL && p->val == val) { p = p->next; } last->next = p; //此时还不能令last=p,因为任然不清楚p和p->next是否相同 } else { last = p; p = p->next; } } return dummy->next; } };
思路二(递归版):
对pHead和pHead->next进行判断,若取值相等,则用while循环找到第一个不等的结点cur,则返回deleteDuplication(cur);若取值不等,则令pHead->next = deleteDuplication(pHead->next),继续递归求解;在递归时需要在初始位置判断递归结束的条件,pHead == NULL返回NULL,pHead != NULL && pHead->next == NULL 返回pHead。
代码二:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == NULL) return NULL; if(pHead != NULL && pHead->next == NULL) return pHead; ListNode *cur; if(pHead->val == pHead->next->val) { cur = pHead->next->next; while(cur != NULL && cur->val == pHead->val) { cur = cur->next; } return deleteDuplication(cur); } else { pHead->next = deleteDuplication(pHead->next); return pHead; } } };