题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
思路:
先写了一个非递归版,对链表遍历一遍可以解决。先找到头节点,然后对当前节点和前一个、后一个节点的值比较,如果不同,可以加入。
写完发现。嚯,别人家的递归就是优雅。
非递归版:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if (pHead == NULL || pHead->next == NULL) return pHead;
ListNode* st = NULL;
if (pHead->val != pHead->next->val)
st = pHead;
else {
ListNode* pre = pHead;
pHead = pHead->next;
while(st == NULL && pHead != NULL) {
if (pHead->next == NULL) {
if (pHead->val != pre->val) {
st = pHead;
break;
}
}
if (pre->val != pHead->val && pHead->val != pHead->next->val) {
st = pHead;
break;
}
pre = pHead;
pHead = pHead->next;
}
}
if (st == NULL) return NULL;
ListNode* pre = pHead;
pHead = pHead->next;
ListNode* ans = st;
while(pHead != NULL) {
if (pHead->next == NULL) {
if (pre->val != pHead->val) {
st->next = pHead;
st = st->next;
st->next = NULL;
}
}
else if (pre->val != pHead->val && pHead->val != pHead->next->val) {
st->next = pHead;
st = st->next;
}
pre = pHead;
pHead = pHead->next;
}
st->next = NULL;
return ans;
}
};
递归版:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if (pHead == NULL || pHead->next == NULL) return pHead;
if (pHead->val == pHead->next->val) {
ListNode* cur = pHead;
while(cur != NULL && cur->val == pHead->val) {
cur = cur->next;
}
return deleteDuplication(cur);
}
else {
pHead->next = deleteDuplication(pHead->next);
}
return pHead;
}
};
二刷依然很多问题啊。
非递归版:
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL) return NULL;
ListNode* pre = new ListNode(0);
pre->next = NULL;
ListNode* ans = pre;
while(pHead != NULL) {
while (pHead != NULL && pHead->next != NULL && pHead->val == pHead->next->val) {
int val = pHead->val;
while(pHead != NULL && val == pHead->val) {
pHead = pHead->next;
}
}
pre->next = pHead;
pre = pre->next;
if (pHead != NULL) pHead = pHead->next;
}
return ans->next;
}
};