📜  在排序的双向链表中查找具有给定产品的对(1)

📅  最后修改于: 2023-12-03 15:37:42.599000             🧑  作者: Mango

在排序的双向链表中查找具有给定产品的对

本篇文章将介绍如何在排序的双向链表中查找具有给定产品的对。我们将提供一个具有标准接口的示例函数,该函数将接收一个排序的双向链表和一个产品,返回该链表中具有该产品的对。

接口

我们提供了以下函数接口:

def search_product_pair(head: Node, product: str) -> List[Tuple[str, str]]:
    pass

函数接收一个指向排序的双向链表的头节点的指针和一个产品的名称作为输入,返回一个包含具有给定产品的对的列表。每个对的元素都是字符串类型。

实现

为了实现这个功能,我们需要首先遍历链表,找到第一个具有该产品的节点。我们可以使用双指针技术从头节点开始并跟踪两个指针:一个指向当前节点和另一个指向前一个节点。

如果当前节点的产品与我们要查找的产品匹配,则将当前以及前一个节点的产品添加到结果列表中。接下来,我们将移动两个指针并继续遍历,直到遍历完整个链表或找到第一个匹配项。

下面是实现这个问题的Python函数:

from typing import List, Tuple


class Node:
    def __init__(self, product: str, price: str):
        self.product = product
        self.price = price
        self.next = None
        self.prev = None


def search_product_pair(head: Node, product: str) -> List[Tuple[str, str]]:
    result = []
    current = head
    previous = None

    while current:
        if current.product == product:
            if previous:
                result.append((previous.product, current.product))
            current = current.next
        else:
            previous = current
            current = current.next
    return result
测试

让我们使用以下测试用例来测试我们的函数:

def test_search_product_pair():
    # create linked list: apple -> banana -> grape -> orange
    head = Node("apple", "0.5")
    tail = head
    tail.next = Node("banana", "0.3")
    tail.next.prev = tail
    tail = tail.next
    tail.next = Node("grape", "0.4")
    tail.next.prev = tail
    tail = tail.next
    tail.next = Node("orange", "0.6")
    tail.next.prev = tail

    assert search_product_pair(head, "peach") == []
    assert search_product_pair(head, "banana") == [("apple", "banana")]
    assert search_product_pair(head, "grape") == [("banana", "grape")]
    assert search_product_pair(head, "orange") == [("grape", "orange")]

测试用例创建了一个双向链表,并使用我们实现的函数来查找具有不同产品名称的对。我们可以看到,我们的函数按预期工作。

结论

通过本文,我们介绍了如何在排序的双向链表中查找具有给定产品的对。我们提供了一个具有标准接口的示例函数,并使用测试用例验证了其行为。

感谢阅读!