Leetcode的细节处理问题。
题目一(重复元素仅保留一个):Given a sorted linked list, delete all duplicates such that each element appear only once. For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
思路:前后指针。
代码:
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if(head == NULL)
return head;
ListNode *p, *q;
p = head;
q = head->next;
while(q != NULL)
{
if(q->val != p->val)
{
p = p->next;
q = q->next;
}
else
{
p->next = q->next;
free(q);//不知道题目内是如何申请的,也许应该用delete p;
q = p->next;
}
}
return head;
}
};
题目二(重复元素一个不留):Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
思路:还是用前后指针。但是前指针所指的内容也有被删除的可能性,所以要再加一个来记录前指针之前的结点。出现重复的话,一齐删除掉。
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
ListNode *ppre, *pre, *p, *tmp;
ListNode *newhead = new ListNode(0); //借助空头结点来保持代码一致性
bool flag;
newhead->next = head;
ppre = newhead;
pre = head;
while(pre != NULL)
{
flag = false;
p = pre->next;
while(p != NULL && p->val == pre->val)
{
flag = true;
tmp = p;
p = p->next;
delete tmp;
}
if(flag) //出现过重复,则需要删除pre
{
ppre->next = p;
delete pre;
pre = p;
}
else //没出现重复,不需要删除pre
{
ppre = ppre->next;
pre = pre->next;
}
}
p = newhead->next;
delete newhead; //释放空头结点
return p;
}
};