删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点

题目

给定一个无序单链表的表头,删除其中值重复出现的节点,例如
1->2->3->3->4->4->2->1->1
结果:
1->2->3->4

思路1

使用Hash表,时间复杂度O(n),空间复杂度O(n)

def remove_node_with_same_val1(head):
    if not head:
        return head

    d = {head.val : True}
    pre = head
    cur = head.next
    while cur:
        if cur.val in d:
            pre.next = cur.next
        else:
            d[cur.val] = True
            pre = cur

        cur = cur.next

    return head

思路2

直接操作链表,时间复杂度O(n^2),空间复杂度O(1)

def find_val_in_linklist(head, val):
    p = head
    while p:
        if p.val == val:
            return True
        p = p.next

    return False


def remove_node_with_same_val2(head):
    if not head:
        return head

    cur = head.next
    head.next = None
    tail = head
    while cur:
        next = cur.next
        cur.next = None
        if not find_val_in_linklist(head, cur.val):
            tail.next = cur
            tail = cur
        cur = next

    return head

测试

import random


class Node():
    def __init__(self, val):
        self.val = val
        self.next = None


def make_linklist(datas):
    head, tail = None, None
    for d in datas:
        node = Node(d)
        if not head:
            head = node
            tail = node
        else:
            tail.next = node
            tail = node

    return head


def dump_to_list(head):
    l = []
    p = head
    while p:
        l.append(p.val)
        p = p.next

    return l


def test(count, maxval):
    datas = []
    for _ in range(count):
        d = random.randint(0, maxval)
        datas.append(d)

    head = make_linklist(datas)
    l = dump_to_list(head)
    print(l)

    head = remove_node_with_same_val1(head)
    l = dump_to_list(head)
    print(l)

    head = make_linklist(datas)
    head = remove_node_with_same_val2(head)
    l = dump_to_list(head)
    print(l)

    print('---------------------------------')


if __name__ == '__main__':
    test(10, 1)
    test(10, 2)
    test(10, 5)
    test(10, 6)
    test(10, 7)


结果

[1, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[1, 0]
[1, 0]
---------------------------------
[1, 0, 0, 0, 1, 1, 2, 1, 2, 2]
[1, 0, 2]
[1, 0, 2]
---------------------------------
[2, 1, 4, 0, 3, 4, 3, 5, 1, 4]
[2, 1, 4, 0, 3, 5]
[2, 1, 4, 0, 3, 5]
---------------------------------
[2, 1, 0, 2, 0, 4, 5, 3, 6, 6]
[2, 1, 0, 4, 5, 3, 6]
[2, 1, 0, 4, 5, 3, 6]
---------------------------------
[1, 0, 1, 3, 4, 4, 3, 6, 5, 3]
[1, 0, 3, 4, 6, 5]
[1, 0, 3, 4, 6, 5]
---------------------------------

设计一个算法来通过一趟遍历确定长度为n的单链表中值最大的节点,首先我们需要一个指针来记录当前最大值的节点,并且需要一个变量来记录当前最大值的值。然后我们从链表的头节点开始,依次遍历每个节点。 在遍历的过程中,我们可以通过比较每个节点的值和当前最大值的值来确定是否需要更新最大值节点的指针和当前最大值的值。具体来说,我们可以先将头节点的值赋给当前最大值,并将当前最大值的节点指针设为头节点,然后用循环从头节点的下一个节点开始遍历整个链表。 在遍历的过程中,对于每个节点,我们可以比较它的值和当前最大值的值,如果它的值大于当前最大值的值,那么我们就更新当前最大值的值为该节点的值,并更新当前最大值的节点指针为该节点。最终,当一趟遍历结束之后,我们就可以得到长度为n的单链表中值最大的节点。 需要注意的是,对于空链表的情况,我们可以设定最大值的节点指针为null,并将当前最大值的值初始化为一个足够小的值,这样在遍历的过程中就可以正确地处理空链表的情况。 综上所述,通过一趟遍历可以确定长度为n的单链表中值最大的节点算法可以通过一个指针来记录当前最大值的节点,并通过一个变量来记录当前最大值的值,然后依次遍历每个节点,不断更新最大值节点指针和当前最大值的值,最终得到长度为n的单链表中值最大的节点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值