Remove Dups:删除未排序链表中的重复元素。如果不使用额外的存储空间应该怎么做?
为了删除链表中的重复元素,必须要对链表进行遍历。可以将已经遍历过的元素存储在一个集合中,如果再次出现相同的元素,就将其删除。这种方法的时间复杂度为O(N)。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
set<decltype(ListNode::val)> sValue;
ListNode** curr = &head;//curr指向前一个节点的指针域
while(*curr != nullptr){
if(sValue.find((*curr)->val) == sValue.end()){
sValue.insert((*curr)->val);
curr = &(*curr)->next;//移动到新节点
}
else{
*curr = (*curr)->next;//删除节点
}
}
return head;
}
};
如果不使用集合,那就要使用两个指针,curr指向当前的元素,runner遍历curr后续元素,并删除和curr相同的元素(其实就是暴力搜索进行删除),这种方法的时间复杂度为O(N ^ 2),空间复杂度为O(1)。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
ListNode* curr = head;
ListNode* runner;
while(curr != nullptr){
runner = curr;
while(runner->next != nullptr){
if(runner->next->val == curr->val){
runner->next = runner->next->next;
}
else runner = runner->next;
}
curr = curr->next;
}
return head;
}
};
679

被折叠的 条评论
为什么被折叠?



