题目
代码思路:
使用一个数组记录每个值出现的次数,当某个节点的值为第一次出现时,将其对应的计数器加一,同时移动左指针向右;当某个节点的值不是第一次出现,将该节点删除。最终返回去重后的链表头结点。(具体实现上可能与题目有所差别,主要看算法)
struct Node{
int x;
Node* next;
};
Node* unique(Node* node)
{
// 定义头结点和两个指针
Node* head = node;
Node* left = head;
Node* temp = NULL;
// 初始化计数数组(题目上是n)
int* arr = new int[1000]();
// 遍历链表
while (left->next)
{
// 如果当前节点的值没有出现过
if (arr[abs(left->next->x)] == 0)
{
arr[abs(left->next->x)]++; // 将该值对应的计数器加一
left = left->next; // 左指针向右移动
}
else
{
// 如果当前节点的值已经出现过
temp = left->next; // 临时保存当前节点
left->next = temp->next; // 左指针跳过当前节点
delete temp; // 删除当前节点
}
}
return head; // 返回去重后的链表头结点
}