第八题 删除重复的 难点在于连续出现重复的while循环里 会遇到 数组结束的边界问题
/*
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 pHead;
// 好像例子是按顺序增长的
// 如果不增长 就是用map 出现过就跳掉
// 保存pre结点,如果一样 就要处理跳过的代码
ListNode *ans=new ListNode(0);
ans->next=pHead;
ListNode *pre = ans;
while(pHead!=NULL)
{
// 如果不相等 这两个往后走
if(pHead->next != NULL && pHead->val != pHead->next->val){
pHead=pHead->next;
pre=pre->next;
}
// 相等了就要往后找到第一个不想等的
// 这里可能会相等到结尾 要注意判断
else{
// 如果说pHead后面没有了,ans后面就结束了,直接返回
if (pHead->next == NULL)
return ans->next;
// 不然就说明这里有相等发生了
// pHead如果和后面都是相等的 就循环往后走 不如说 233333456 那么中间的3都要跳过
// 如果说循环到后面23333就结束了,那么pHead就和上面一样 pHead 后面不会再有 退出循环
while(pHead->next!=NULL && pHead->val==pHead->next->val){
pHead=pHead->next;
}
pHead=pHead->next;
pre->next=pHead;
}
}
return ans->next;
}
};
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 pHead;
// 好像例子是按顺序增长的
// 如果不增长 就是用map 出现过就跳掉
// 保存pre结点,如果一样 就要处理跳过的代码
ListNode *ans=new ListNode(0);
ans->next=pHead;
ListNode *pre = ans;
while(pHead!=NULL)
{
// 如果不相等 这两个往后走
if(pHead->next != NULL && pHead->val != pHead->next->val){
pHead=pHead->next;
pre=pre->next;
}
// 相等了就要往后找到第一个不想等的
// 这里可能会相等到结尾 要注意判断
else{
// 如果说pHead后面没有了,ans后面就结束了,直接返回
if (pHead->next == NULL)
return ans->next;
// 不然就说明这里有相等发生了
// pHead如果和后面都是相等的 就循环往后走 不如说 233333456 那么中间的3都要跳过
// 如果说循环到后面23333就结束了,那么pHead就和上面一样 pHead 后面不会再有 退出循环
while(pHead->next!=NULL && pHead->val==pHead->next->val){
pHead=pHead->next;
}
pHead=pHead->next;
pre->next=pHead;
}
}
return ans->next;
}
};