法一:遍历一遍,如果发现重复的就去掉这个节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)
return head;
ListNode *walker = head;
int val_last = head->val;
ListNode *node_pre = head;
while(walker->next != NULL)
{
ListNode *node_cur = walker->next;
if(!node_cur)
return head;
if(val_last == node_cur->val)
{
node_pre->next = node_cur->next;
delete node_cur;
}
else
{
val_last = node_cur->val;
node_pre = node_cur;
walker = node_cur;
}
}
return head;
}
};
法二:一行搞定 牛逼
return h && (h->next = deleteDuplicates(h->next)) && h->next->val == h->val ? h->next : h;
if (h && (h->next = deleteDuplicates(h->next)) && h->next->val == h->val)
delete h, h = h->next;
return h;
法三:
这个方法也不错。
ListNode* deleteDuplicates(ListNode* head) {
ListNode* cur = head;
while(cur) {
while(cur->next && cur->val == cur->next->val) {
cur->next = cur->next->next;
}
cur = cur->next;
}
return head;
}
法四:这个考虑了内存泄漏的问题
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *walker = head;
while(walker != NULL)
{
ListNode *node_remove = walker->next;
if(node_remove && node_remove->val == walker->val)
{
walker->next = walker->next->next;
delete node_remove;
}
else
walker = walker->next;
}
return head;
}
};