Python程序员面试算法宝典---解题总结: 第1章 链表 1.2 如何从无序链表中移除重复项

#!/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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值