#!/usr/bin/env python
# encoding: utf-8
'''
Python程序员面试算法宝典---解题总结: 第1章 链表 1.2 如何从无序链表中移除重复项
题目:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,例如链表 1->3->1->5->5->7,
去掉重复项后变为1->3->5->7
分析:
最简单的方法就是需要有一个数组,记录所有不重复的元素,然后以该数组为输入,
重新构建一个链表。
更快的方式是:
记录当前结点和当前节点的上一个结点,并用一个set存放已经包含的元素,
对当前结点,如果当前节点在已有元素的集合中,则说明当前结点重复,
则让当前节点的上一个节点直接指向当前节点的下一个节点;
否则,将当前结点加入到已有元素的集合中;
关键:
1 解题总结
记录当前结点和当前节点的上一个结点,并用一个set存放已经包含的元素,
对当前结点,如果当前节点在已有元素的集合中,则说明当前结点重复,
则让当前节点的上一个节点直接指向当前节点的下一个节点;
否则,将当前结点加入到已有元素的集合中;
参考:
Python程序员面试算法宝典
'''
class Node(object):
def __init__(self, data=None, nextNode=None):
self.data = data
self.nextNode = nextNode
def buildList(head, arr):
if not arr or not head:
return head
currNode = head
for value in arr:
newNode = Node(value)
currNode.nextNode = newNode
currNode = newNode
return head
def printList(head):
if not head:
return
currNode = head.nextNode
while currNode:
print currNode.data
currNode = currNode.nextNode
def removeRepeated(head):
if not head:
return head
if head.nextNode is None:
return head
currNode = head.nextNode
previousNode = head
existedNodes = set()
while currNode:
data = currNode.data
if data in existedNodes:
previousNode.nextNode = currNode.nextNode
else:
existedNodes.add(data)
previousNode = currNode
currNode = currNode.nextNode
return head
def process():
arr = [1, 3, 1, 5, 5, 7]
head = Node()
linkList = buildList(head, arr)
# printList(linkList)
newHead = removeRepeated(linkList)
printList(newHead)
if __name__ == "__main__":
process()