如何使用Python实现链表的判断一个链表是否为另一个链表的子序列操作
链表可以用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,符合预期的结果。
相关文章