题目描述:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,例如链表1->3->1->5->5->7,去掉重复项后变为1->3->5->7。
class LNode():
def __init__(self):
self.data = None # 数据域
self.next = None # 指针域
"""
** 方法功能:对带头结点的无序单链表删除重复的结点
** 输入参数:head:链表头结点
"""
def removeDup(head):
if head == None or head.next == None:
return
outerCur = head.next # 用于外层循环,指向链表的第一个结点
innerCur = None # 用于内层循环用来遍历outerCur后面的结点
innerPre = None # innerCur的前驱结点
while outerCur != None:
innerCur = outerCur.next
innerPre = outerCur
while innerCur != None:
# 找到重复的结点并删除
if outerCur.data == innerCur.data:
innerPre.next = innerCur.next
innerCur = innerCur.next
else:
innerPre = innerCur
innerCur = innerCur.next
outerCur = outerCur.next
# 方法二;
def removeDupRecursion(head):
if head.next is None:
return head
pointer = None
cur = head
# 对以head.next为首的子链表删除重复的结点
head.next = removeDupRecursion(head.next)
pointer = head.next
# 找出以head.next为首的子链表中与head结点相同的结点并删除
while pointer is not None:
if head.data == pointer.data:
cur.next = pointer.next
pointer = cur.next
else:
pointer = pointer.next
cur = cur.next
return head
"""
方法功能:对带头结点的单链删除重复节点 输入参数:head:链表头结点
"""
def removeDup2(head):
if head is None:
return
head.next = removeDupRecursion(head.next)
if __name__=="__main__":
i = 1
head = LNode()
head.next = None
tmp = None
cur = head
while i < 7:
tmp = LNode()
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