Python链表删除dupli

2024-04-23 19:00:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个代码,以删除重复的排序链表“头”。如果列表以重复结尾,我下面的代码总是返回最后一个副本。例如,[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

Tags: 代码l1列表returnif排序结尾副本
2条回答

问题解决方案

  1. 使用实例变量data和next创建一个类节点。在
  2. 使用实例变量head和last\u node创建一个类LinkedList。在
  3. 变量head指向链接列表中的第一个元素,而last_节点指向最后一个元素。在
  4. 定义方法append、getprev_node、remove和display。在
  5. append方法接受一个数据项作为参数,并将具有该数据项的节点追加到列表中。在
  6. get_prev_node方法以引用节点为参数并返回上一个节点。当引用节点是第一个节点时,它返回None。在
  7. remove方法将一个节点作为参数,并将其从列表中删除。在
  8. 方法display遍历第一个节点的列表并打印每个节点的数据。在
  9. 定义一个函数remove\u 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\u duplicates被调用以从列表中删除重复项。在
  4. 将显示链接列表。在

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

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

相关问题 更多 >