您当前的位置: 首页 > 

IT之一小佬

暂无认证

  • 1浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

移除重复节点

IT之一小佬 发布时间:2021-04-13 22:14:28 ,浏览量:1

移除重复节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]

示例2:

 输入:[1, 1, 1, 1, 2]
 输出:[1, 2]

提示:

  1. 链表长度在[0, 20000]范围内。
  2. 链表元素在[0, 20000]范围内。

示例代码:

#  definition for a single_link list
class LinkNode(object):
    def __init__(self, val):
        self.val = val
        self.next = None


def creat_nodelist(li):
    if not li:
        return
    head = pos = LinkNode(li[0])
    for i in li[1:]:
        pos.next = LinkNode(i)
        pos = pos.next
    return head


def print_nodelist(head):
    while head:
        print(head.val, end=' ')
        head = head.next
    print()


def remove_duplicate_nodes(head):
    if not head:
        return head
    current_node = {head.val}
    pos = head
    while pos.next:
        cur = pos.next
        if cur.val not in current_node:
            current_node.add(cur.val)
            pos = pos.next
        else:
            pos.next = pos.next.next
    return head


#  test1
node = [1, 2, 3, 3, 2, 1, 5]
node_link = creat_nodelist(node)
obj = remove_duplicate_nodes(node_link)
print(obj)
print_nodelist(obj)
#  test2
node2 = [1, 1, 1, 1, 2]
node_link2 = creat_nodelist(node2)
obj2 = remove_duplicate_nodes(node_link2)
print(obj2)
print_nodelist(obj2)

运行结果:

解析:

方法一:哈希表

对给定的链表进行一次遍历,并用一个哈希集合(HashSet)来存储所有出现过的节点。

由于在大部分语言中,对给定的链表元素直接进行「相等」比较,

实际上是对两个链表元素的地址(而不是值)进行比较。

因此,我们在哈希集合中存储链表元素的值,方便直接使用等号进行比较。

具体地,我们从链表的头节点 head 开始进行遍历,遍历的指针记为 pos。

由于头节点一定不会被删除,因此我们可以枚举待移除节点的前驱节点,减少编写代码的复杂度。

关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0514s