题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路:
我的思路是先定义一个哑节点dump,哑节点的next指向pHead的第一个元素。定义一个pre指针指向哑节点dump,定义一个cur指针指向pHead的第一个节点。
1.判断pre->next->val==pre->next->val,如果成立进入第2步,否则进入第三步;
2.循环判断pre->next->val==cur->val,如果成立cur=cur->next;这一步的作用是将cur指针移出重复的数字之外;循环结束后,将pre->next指向cur;
3.如果不是重复的数值,pre和cur都往后移动。重复第1步。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (!pHead) return pHead;
ListNode* dump = new ListNode(-1);
dump->next = pHead;
ListNode* cur = pHead;
ListNode* pre = dump;
while (cur) {
if (cur->next && pre->next->val == pre->next->next->val) {
while (cur && pre->next->val == cur->val) {
cur = cur->next;
}
pre->next = cur;
}
else {
pre = pre->next;
cur = cur->next;
}
}
return dump->next;
}
};