📅  最后修改于: 2023-12-03 15:41:58.003000             🧑  作者: Mango
在编写代码时,经常需要查找单个链接列表(链表)的中间节点(即单链表中间节点)。本文介绍递归方法查找单个链接列表的中间节点。
单个链接列表是一种常见的数据结构。它可以在内存上动态地分配空间,每个节点包含一些数据和一个指向下个节点的指针。如下图所示:
在单个链接列表中,我们需要查找其中间节点。如果链表中有n个节点,则链表的中间节点就是第n/2 (向下取整)个节点。
递归方法一般通过递归调用函数本身来解决问题。在查找单个链接列表的中间节点时,我们可以使用递归方法。
具体步骤如下:
定义一个函数,函数名为findMiddle
,其参数为head
,表示链表的头节点。
定义一个全局变量count
,表示当前链表中节点的个数。
在findMiddle
函数中,统计链表中节点的个数,并将其保存在count
变量中。
定义一个helper函数,函数名为helper
,其参数为node
和currentIndex
, node表示当前节点,currentIndex表示当前节点在链表中的位置。
在helper函数中,如果当前节点为null,则直接返回。
如果当前节点不为null,则递归调用helper函数,传入下一个节点以及currentIndex+1。
在helper函数中,如果currentIndex等于count/2,则当前节点为链表中间节点,将其返回。
下面是该算法的Python代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
count = 0
def findMiddle(self, head: ListNode) -> ListNode:
self.count = 0
node = head
while node:
self.count += 1
node = node.next
return self.helper(head, 1)
def helper(self, node: ListNode, currentIndex: int) -> ListNode:
if not node:
return None
if currentIndex == self.count // 2 + 1:
return node
return self.helper(node.next, currentIndex+1)
我们编写一些简单的测试样例,来验证我们的算法是否正确。
# 测试样例1
head1 = ListNode(1)
head1.next = ListNode(2)
head1.next.next = ListNode(3)
head1.next.next.next = ListNode(4)
head1.next.next.next.next = ListNode(5)
s = Solution()
middleNode = s.findMiddle(head1)
assert middleNode.val == 3
# 测试样例2
head2 = ListNode(1)
head2.next = ListNode(2)
head2.next.next = ListNode(3)
head2.next.next.next = ListNode(4)
head2.next.next.next.next = ListNode(5)
head2.next.next.next.next.next = ListNode(6)
s = Solution()
middleNode = s.findMiddle(head2)
assert middleNode.val == 4
本文介绍了递归方法查找单个链接列表的中间节点。这个问题可以通过递归方法比较容易地得到解决。对于初学者来说,这种方法可以提高代码的可读性和可维护性。