📜  循环链表的节点总和(1)

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

循环链表的节点总和

循环链表是一种链表,它的尾节点指向头节点,形成循环。在循环链表中,任意节点的下一个节点都不会是 null。

给定一个循环链表的头节点 head ,返回循环链表的节点总和。

解题思路

遍历循环链表,累加节点的值即可。

由于是循环链表,遍历需要特殊处理,避免出现死循环。

一种通用的处理方法是设置一个变量 visited ,记录已访问过的节点,每访问一个节点时,判断其是否已经在 visited 中出现过,如果出现过,则说明已经遍历完整个循环链表,可退出循环。

代码如下:

public int sumNodesInCircularLinkedList(Node head) {
    if (head == null) {
        return 0;
    }

    Set<Node> visited = new HashSet<>();
    int sum = 0;
    Node curr = head;
    while (curr != null) {
        if (visited.contains(curr)) {
            break;
        }
        sum += curr.val;
        visited.add(curr);
        curr = curr.next;
        if (curr == null) {
            curr = head;
        }
    }
    return sum;
}
复杂度分析

时间复杂度为 O(n),其中 n 是循环链表中节点的个数。每个节点最多访问两次。

空间复杂度为 O(n),需要使用一个 HashSet 存储已访问过的节点。