题目简介:
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
1 2
| 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]
|
示例2:
1 2
| 输入:[1, 1, 1, 1, 2] 输出:[1, 2]
|
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
思路:
首先先设置一个res = head
来保存原始的head
。
然后定义一个哈希表,遍历链表时若第一次遇到节点中的val
,则存入哈希表;
否则,则一直删除节点,直至遇到不重复的节点,并把该节点的val
存入哈希表。
最后返回一开始定义的res
即可。
tip:
- 注意要将删除过程后,此时不重复的节点值存入哈希表中。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
class Solution { public: ListNode* removeDuplicateNodes(ListNode* head) {
if(head == NULL) return head;
unordered_map<int, int> map;
ListNode* res = head; map[head -> val]++;
while(head != NULL && head -> next != NULL){
ListNode* next_node = head -> next;
if(!map.count(next_node -> val)){
map[next_node -> val]++; head = next_node; } else{
while(next_node != NULL && map.count(next_node -> val)){ next_node = next_node -> next; } if(next_node != NULL) map[next_node -> val]++; head -> next = next_node; head = next_node; } } return res; } };
|