Python链表删除重复项

时间:2019-01-04 17:37:00

标签: python

我正在尝试编写代码以从排序的链接列表“ head”中删除重复项。如果列表以重复结尾,则下面的我的代码始终返回最后一个重复。例如[1,2,2,3,3]将返回[1,2,3,3]。我不知道为什么。有人有主意吗?

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """

        if not head:
            return head

        l1=newhead=ListNode(head.val)
        head=head.next


        while head:
            if head.val!=l1.val:
                l1.next=head
                l1=l1.next
            head=head.next

        return newhead

2 个答案:

答案 0 :(得分:1)

您应该跟踪每个新值的前导节点,并继续获取下一个节点,直到获得具有不同值的节点为止,此时,您将该节点分配为前导节点的下一个节点:

class Solution(object):
    def deleteDuplicates(self, head):
        node = head
        while node:
            lead = node
            while node.next and node.next.val == lead.val:
                node = node.next
            node = lead.next = node.next
        return head

答案 1 :(得分:0)

问题解决方案

  1. 使用实例变量data和next创建一个类Node。
  2. 使用实例变量head和last_node创建一个LinkedList类。
  3. 变量head指向链接列表中的第一个元素,而last_node指向最后一个元素。
  4. 定义方法append,get_prev_node,删除并显示。
  5. append方法将数据项作为参数,并将带有该数据项的节点追加到列表中。
  6. 方法get_prev_node以引用节点作为参数并返回前一个节点。当参考节点是第一个节点时,它将返回None。
  7. remove方法将节点作为参数并将其从列表中删除。
  8. 方法显示从第一个节点遍历列表,并打印每个节点的数据。
  9. 定义一个函数remove_duplicates,该函数将链接列表作为参数并从中删除重复项。
  10. remove_duplicates函数使用两个嵌套循环来删除重复的节点。
  11. 创建LinkedList的实例,删除重复的节点并显示列表。

程序/源代码

这是Python程序的源代码,用于从链接列表中删除重复项。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList:
    def __init__(self):
        self.head = None
        self.last_node = None

    def append(self, data):
        if self.last_node is None:
            self.head = Node(data)
            self.last_node = self.head
        else:
            self.last_node.next = Node(data)
            self.last_node = self.last_node.next

    def get_prev_node(self, ref_node):
        current = self.head
        while (current and current.next != ref_node):
            current = current.next
        return current

    def remove(self, node):
        prev_node = self.get_prev_node(node)
        if prev_node is None:
            self.head = self.head.next
        else:
            prev_node.next = node.next

    def display(self):
        current = self.head
        while current:
            print(current.data, end = ' ')
            current = current.next


def remove_duplicates(llist):
    current1 = llist.head
    while current1:
        data = current1.data
        current2 = current1.next
        while current2:
            if current2.data == data:
                llist.remove(current2)
            current2 = current2.next
        current1 = current1.next


a_llist = LinkedList()

data_list = input('Please enter the elements in the linked list: ').split()
for data in data_list:
    a_llist.append(int(data))

remove_duplicates(a_llist)

print('The list with duplicates removed: ')
a_llist.display()

程序说明

  1. 已创建LinkedList的实例。
  2. 提示用户输入列表的数据项。
  3. 调用remove_duplicates函数可从列表中删除重复项。
  4. 显示链接列表。