1. 程式人生 > >刪除排序連結串列裡面的重複元素,留下不重複的元素

刪除排序連結串列裡面的重複元素,留下不重複的元素

給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。

示例 1:

輸入: 1->2->3->3->4->4->5
輸出: 1->2->5

示例 2:

輸入: 1->1->1->2->3
輸出: 2->3

分析:這種題一般分為兩種實現,一種構建一個新的連結串列,一種是原地操作。

如果用構建一個新連結串列的方式,假設連結串列是[n1, n2, n3 ... null],需要從頭遍歷找到一段非重複的元素[n1-ni),然後把[n1, ni)用尾插的方式插入到新連結串列中。然後從ni開始重複上面的操作,直到連結串列結束,即n1 == null。

如果進行原地操作,同樣的,需要記錄連續序列的前一個節點current(在資料關係上可以稱之為n0),因為做刪除操作的時候需要用到,然後同樣找重複元素[n1-ni],如果沒有找到重複元素,那麼前進一步,如果找到了,那麼將current的下一個節點直接置為ni,然後繼續從ni開始重複執行。

/**
 * 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 == NULL || head->next == NULL) {
            return head;
        } 
        
        ListNode s(0), *current = &s;
        s.next = head;
        
        for (ListNode * next = head; next != NULL;) {
            if (next->next == NULL) {
                break;
            }
            
            int samecount = 0;
            ListNode* diff = next->next;
            for (;diff != NULL && diff->val == next->val;diff=diff->next, ++samecount);
            if (samecount == 0) {
                current = current->next;
                next = next->next;
            } else {
                current->next = diff;
                next = diff;
            }
        }
        
        return s.next;
    }
};