方法一: 顺序删除
算法思想:
通过双层循环直接在链表上删除。外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另一个指针遍历其余节点与外层循环指针所指的节点的数据进行对比,若是相同则删除
性能分析:
该算法的时间复杂度为o(n*2),空间复杂度为o(n)
#方法一:顺序删除
class LNode(object):
def __init__(self, item):
self.data = item
self.next = None
def removeDup(head):
if head == None or head.next == None:
return
outerCur = head.next
interCur = None
interPre = None
while outerCur != None:
interCur = outerCur.next
interPre = outerCur
while interCur != None:
if outerCur.data == interCur.data:
interPre.next = interCur.next
interCur = interPre.next
else:
interPre = interCur
interCur = interCur.next
outerCur = outerCur.next
if __name__ == "__main__":
i = 1
head = LNode(0)
head.next = None
tmp = None
cur = head
while i < 7:
tmp = LNode(i)
if i%2 == 0:
tmp.data = i+1
elif i%3 == 0:
tmp.data = i-2
else:
tmp.data = i
tmp.next = None
cur.next = tmp
cur = tmp
i += 1
print("删除重复节点前:")
cur = head.next
while cur != None:
print(cur.data)
cur = cur.next
removeDup(head)
print("删除节点后:")
cur = head.next
while cur != None:
print(cur.data)
cur = cur.next
代码执行结果:
删除重复节点前:
1
3
1
5
5
7
删除节点后:
1
3
5
7
方法二:空间换时间
算法思想:
1. 建立一个列表保存已经遍历过的节点的值
2. 从头开始遍历链表,如果节点内容不再列表中,那么继续遍历链表,若已经存在,则删除该节点
性能分析:
时间复杂度为o(N),空间复杂度为o(N),以空间换时间
class LNode(object):
def __init__(self, item):
self.data = item
self.next = None
def removeDup2(head):
if head == None or head.next == None:
return
cur = head.next
pre = None
hash_list = list()
while cur != None:
if cur.data in hash_list:
pre.next = cur.next
cur = pre.next
else:
hash_list.append(cur.data)
pre = cur
cur = cur.next
if __name__ == "__main__":
i = 1
head = LNode(0)
head.next = None
tmp = None
cur = head
while i < 7:
tmp = LNode(i)
if i%2 == 0:
tmp.data = i+1
elif i%3 == 0:
tmp.data = i-2
else:
tmp.data = i
tmp.next = None
cur.next = tmp
cur = tmp
i += 1
print("删除重复节点前:")
cur = head.next
while cur != None:
print(cur.data)
cur = cur.next
removeDup2(head)
print("删除节点后:")
cur = head.next
while cur != None:
print(cur.data)
cur = cur.next
代码执行结果:
删除重复节点前:
1
3
1
5
5
7
删除节点后:
1
3
5
7