编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
两种写法。1.标记已经遍历的节点。
2.遍历节点的同时再开一个循环,移除后续已经重复的节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
const static int maxn = 1e5 + 10;
bool vis[maxn] = {0};
ListNode* removeDuplicateNodes(ListNode* head) {
ListNode *hair = new ListNode();
hair ->next = head;
ListNode* pre = hair, *cur = head;
while(cur != NULL) {
if(vis[cur -> val] == false) {
vis[cur -> val] = true;
pre = cur;
cur = cur -> next;
} else {
pre -> next = cur -> next;
cur = cur -> next;
}
}
return hair -> next;
}
};