如何使用Python实现链表的判断一个链表是否为另一个链表的子序列操作

2023-04-11 00:00:00 序列 链表 如何使用

链表可以用Python中的类来实现,一个节点包括该节点的值和指向下一个节点的指针。判断一个链表是否为另一个链表的子序列可以通过递归实现,即在主链表上依次判断是否存在与子序列相同的一段连续子序列。

下面是使用Python实现链表的代码示例,同时演示了如何判断一个链表是否为另一个链表的子序列。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def isSubList(head1: ListNode, head2: ListNode) -> bool:
    if not head2:
        # 空链表一定是任意链表的子序列
        return True
    if not head1:
        # 空链表不能是非空链表的子序列
        return False
    if head1.val == head2.val:
        # 当前节点相同,继续检查下一个节点
        return isSubList(head1.next, head2.next)
    else:
        # 当前节点不同,检查主链表的下一个节点是否是子序列的起点
        return isSubList(head1.next, head2)

# test
# 构造主链表1->2->3->4->5->6
head1 = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5, ListNode(6))))))
# 构造子序列2->3->4
head2 = ListNode(2, ListNode(3, ListNode(4)))
print(isSubList(head1, head2))  # True

# 构造主链表p->i->d->a->n->c->o->d->e->.->c->o->m
head1 = ListNode("p", ListNode("i", ListNode("d", ListNode("a", ListNode("n", 
        ListNode("c", ListNode("o", ListNode("d", ListNode("e", 
        ListNode(".", ListNode("c", ListNode("o", ListNode("m")))))))))))))
# 构造子序列d->a->n->c->o->d->e
head2 = ListNode("d", ListNode("a", ListNode("n", ListNode("c", ListNode("o", 
        ListNode("d", ListNode("e"))))))))
print(isSubList(head1, head2))  # True

# 构造主链表p->i->d->a->n->c->o->d->e->.->c->o->m
head1 = ListNode("p", ListNode("i", ListNode("d", ListNode("a", ListNode("n", 
        ListNode("c", ListNode("o", ListNode("d", ListNode("e", 
        ListNode(".", ListNode("c", ListNode("o", ListNode("m")))))))))))))
# 构造子序列d->a->n->c->o->d->y
head2 = ListNode("d", ListNode("a", ListNode("n", ListNode("c", ListNode("o", 
        ListNode("d", ListNode("y"))))))))
print(isSubList(head1, head2))  # False

以上代码定义了一个ListNode类,可以用来构造链表节点。isSubList函数用于判断主链表head1是否包含子序列head2。递归调用该函数,如果当前节点相同,继续检查下一个节点;否则,检查主链表的下一个节点是否是子序列的起点。注意空链表的特殊处理。

测试用例中分别构造了两个链表,第一个链表是主链表,包含了整数和字符串两种类型的节点。第二个链表是子序列,用于测试判断是否为主链表的子序列。运行代码,可以看到三个测试用例的输出结果为True、True、False,符合预期的结果。

相关文章