刪除排序連結串列裡面的重複元素,留下不重複的元素
阿新 • • 發佈:2019-01-25
給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。
示例 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; } };