📅  最后修改于: 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 存储已访问过的节点。