程序员面试金典 2.1

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;
    }
};

你可能感兴趣的:(《程序员面试金典》)