Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python链表删除重复项_Python - Fatal编程技术网

Python链表删除重复项

Python链表删除重复项,python,Python,我正试图写一个代码来删除排序链表“head”中的重复项。如果列表以重复项结尾,我下面的代码总是返回最后一个重复项。例如,[1,2,2,3,3]将返回[1,2,3,3]。我不明白为什么。有人有主意吗 class Solution(object): def deleteDuplicates(self, head): """ :type head: ListNode :rtype: ListNode """ if

我正试图写一个代码来删除排序链表“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

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

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

问题解决方案

  • 使用实例变量data和next创建类节点
  • 使用实例变量head和last_node创建类LinkedList
  • 变量head指向链表中的第一个元素,而last_节点指向最后一个元素
  • 定义方法append、get_prev_节点、remove和display
  • append方法将数据项作为参数,并将带有该数据项的节点追加到列表中
  • 方法get_prev_node将引用节点作为参数并返回上一个节点。当引用节点是第一个节点时,它返回None
  • remove方法将节点作为参数,并将其从列表中删除
  • 方法display从第一个节点遍历列表并打印每个节点的数据
  • 定义一个函数remove_duplicates,该函数将链表作为参数并从中删除重复项
  • 函数remove_duplicates使用两个嵌套循环删除重复节点
  • 创建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()
    
    节目说明

  • 此时将创建LinkedList的实例
  • 系统将提示用户输入列表的数据项
  • 调用函数remove_duplicates从列表中删除重复项
  • 将显示链接列表

  • 如果要删除所有重复项,您可以始终使用
    set
    @Mstaino您可以在链接列表上使用set操作吗?看起来您的while循环中缺少了一个else
    head
    只应变为
    head。下一步
    当值不匹配时,不是循环中的每一圈。@Mike仍然尝试了相同的问题