如何用基础的c++语言简单易懂的写出可以求循环列表长度的算法??
参考一下
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
int countNodes(ListNode *head) {
if (!head) return 0; // 处理空链表
int count = 1; // 计数器,初始值为1
ListNode *p = head->next; // p指向head的下一个节点
while (p != head) { // 当p回到head时,结束循环
count++; // 计数器加1
p = p->next; // p指向下一个节点
}
return count;
}
int main() {
// 创建循环链表
ListNode *head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = head; // 链表的最后一个节点指向头节点,形成循环
cout << "Length of circular linked list: " << countNodes(head) << endl;
return 0;
}
#include <iostream>
using namespace std;
// 定义循环链表节点结构体
struct Node {
int data;
Node* next;
Node(int d) : data(d), next(NULL) {}
};
// 求循环链表长度的函数
int getLength(Node* head) {
if (head == NULL) {
return 0;
}
int length = 1;
Node* current = head->next;
while (current != head) {
length++;
current = current->next;
}
return length;
}
int main() {
// 创建一个简单的循环链表
Node* head = new Node(1);
Node* node1 = new Node(2);
Node* node2 = new Node(3);
Node* node3 = new Node(4);
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = head;
// 调用函数求循环链表长度并输出结果
int length = getLength(head);
cout << "长度 = " << length << endl;
// 释放链表内存
delete node3;
delete node2;
delete node1;
delete head;
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:迪杰斯特拉算法对大众考研学子和数据结构及算法爱好者都是入门的一个算法,如果读者害怕自己学不会学不好,无法理解,那就多看几遍,笔者也是从只会写链表到手写迪杰斯特拉算法的,没有谁学数据结构是一路通窍的,笔者学KMP曾半个月走不出next数组的坑里,最后也大彻大悟了
另外笔者分享一下在写算法类题目时的感想:
其实迪杰斯特拉算法和DFS,BFS的本质差不多,都是通过“搜索”来完成对某路径的查找,但其实DFS,BFS一样也能通过设定回溯数组或者其他操作来找到最短路,但显然DFS,BFS是暴力搜索,每一步的探索都是没有目的的盲目搜索,和迪杰斯特拉的贪心搜索效率差很多,但笔者认为:当任意一个顶点,他都能向上下左右走通,并且边权为0,1的时候,迪杰斯特拉其实跟DFS,BFS差不多,因为迪杰斯特拉需要通过边权关系来模拟贪心来达到最快最优解,而此时边权意义不大的时候,迪杰斯特拉也就失去了他的优势,但很显然我们大部分的应用还是有边权的,读者可以根据自己的题目情况,来确认使用深广搜还是迪杰斯特拉,不过目前算法题(LEETCODE为主)中很少见直接使用迪杰斯特拉算法的
最后感谢您的阅读。
文章为笔者笔记,如果文章有错误之处,描述不当之处还请您告知。
希望这篇文章能给您带来一些收获