删除无序单链表中值重复出现的节点
题目
给定一个无序单链表的表头,删除其中值重复出现的节点,例如
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]
---------------------------------