📜  递归查找单个链接列表的中间(1)

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

递归查找单个链接列表的中间

在编写代码时,经常需要查找单个链接列表(链表)的中间节点(即单链表中间节点)。本文介绍递归方法查找单个链接列表的中间节点。

单个链接列表

单个链接列表是一种常见的数据结构。它可以在内存上动态地分配空间,每个节点包含一些数据和一个指向下个节点的指针。如下图所示:

单个链接列表

在单个链接列表中,我们需要查找其中间节点。如果链表中有n个节点,则链表的中间节点就是第n/2 (向下取整)个节点。

递归方法查找单个链接列表的中间节点

递归方法一般通过递归调用函数本身来解决问题。在查找单个链接列表的中间节点时,我们可以使用递归方法。

具体步骤如下:

  1. 定义一个函数,函数名为findMiddle,其参数为head,表示链表的头节点。

  2. 定义一个全局变量count,表示当前链表中节点的个数。

  3. findMiddle函数中,统计链表中节点的个数,并将其保存在count变量中。

  4. 定义一个helper函数,函数名为helper,其参数为nodecurrentIndex, node表示当前节点,currentIndex表示当前节点在链表中的位置。

  5. 在helper函数中,如果当前节点为null,则直接返回。

  6. 如果当前节点不为null,则递归调用helper函数,传入下一个节点以及currentIndex+1。

  7. 在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
总结

本文介绍了递归方法查找单个链接列表的中间节点。这个问题可以通过递归方法比较容易地得到解决。对于初学者来说,这种方法可以提高代码的可读性和可维护性。