letcode面试题02.01 移除链表的相同节点

题目: https://leetcode-cn.com/problems/remove-duplicate-node-lcci/

思路一:利用unordered_set这个容器的函数 《count》。先设置unordered_set,如果unordered_set容器内没有相同的节点,则将其加入容器中,指针向后移一位,否则则将指针向后移两位,直到链表遍历结束
补充知识:
unordered_set它的实现基于hashtable,它的结构图仍然可以用下图表示,这时的空白格不在是单个value,而是set中的key与value的数据包
有unordered_set就一定有unordered_multiset.跟set和multiset一样,一个key可以重复一个不可以

unordered_set是一种无序集合,既然跟底层实现基于hashtable那么它一定拥有快速的查找和删除,添加的优点.基于hashtable当然就失去了基于rb_tree的自动排序功能
unordered_set无序,所以在迭代器的使用上,set的效率会高于unordered_set

unordered_se中的count函数只会返回1,0
对于count(x)
若us中存在x,返回1,反之,返回0

ListNode* removeDuplicateNodes(ListNode* head) {
if (head == NULL)
return head;
unordered_set occurred = { head->val };
ListNodepos = head;
while (pos->next) {
ListNode
cur = pos->next;
if (!occurred.count(cur->val)) {
occurred.insert(cur->val);
pos = pos->next;
}
else pos->next = pos->next->next;
}
pos->next = NULL;
return head;
}

思路二:双重循环链表
设置两个指针,分别用于内外两重循环,第一重循环从第一个节点开始,保存当前节点,第二重循环的指针第一重循环保存的结点开始,如果指针指向的节点的下一个 结点的值和第一重循环保存的节点不同,则指针向前移动一位,如果相同,则指针向前移动两位,直到空。第二重循环结束;一直循环下去,直到所有节点遍历结束,第一重循环结束。

ListNode* removeDuplicateNodes(ListNode* head) {
ListNodephead = head;
while (phead) {
ListNode
p = phead;
while (p->next) {
if (p->next->val == phead->val)
p->next = p->next->next;
else
p = p->next;
}
phead = phead->next;

          }
          return head;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值