每日一题——带环链表

判断链表是否带环。
若带环求环的长度。
若带环求环的入口处。

并计算上述问题的时间复杂度

求环的入口处(前面几行代码证明带环)
至于环的长度,从之前的推论可知,链表起始到环的入口的距离等于相遇点走到环入口的距离,所以环的长度就等于链表起始点到相遇点的距离(代码中的count)。


  ListNode *detectCycle(ListNode *head) {
        // write your code here
        ListNode* begin = head;
        ListNode* last = head;
        if(head == NULL || head->next == NULL)
        {
            return NULL;
        }
        int count = 0;  
        while(begin->next != NULL && begin->next->next != NULL)
        {
            begin = begin->next->next;
            last = last->next;
            count++;   //记录到相遇点的距离,即环长
            if(begin == last)   //相遇点
                {
                    ListNode* newBegin = head;
                    ListNode* newLast = begin;
                    while(newBegin != newLast)
                    {
                        newBegin = newBegin->next;
                        newLast = newLast->next;
                    }
                    return newBegin;
                }
        }
        return NULL;
    }

这里写图片描述

时间复杂度:
1>:O(N)
2>:O(N)
3>:O(N^2)

在C语言中,我们可以使用链表数据结构来构建一个简单的一元多项式加法运算器。链表非常适合表示多项式,因为每个节点可以存储一个系数和指数,而且可以根据需要动态增加或删除节点。下面是一个基本的设计和实现步骤: 1. 定义节点结构体(Node),包含系数(coef)、指数(exp)以及指向下一个节点的指针(next): ```c typedef struct PolynomialNode { int coef; // 系数 int exp; // 指数 struct PolynomialNode* next; // 指向下一个节点 } PolynomialNode; ``` 2. 创建和操作节点函数: - `createNode(int coef, int exp)`:用于创建新节点。 - `insertNode(PolynomialNode** head, int coef, int exp)`:将新节点插入链表头部。 - `readPolyFromFile(const char* filename)`:读取文件中的多项式并创建链表。 3. 加法操作函数: - `addPolynomials(PolynomialNode* poly1, PolynomialNode* poly2)`:遍历两个链表,对相同指数的系数进行加法,并合并结果链表。 4. 打印多项式函数: - `printPolynomial(PolynomialNode* head)`:按顺序打印链表中的各项。 5. 主函数: - 初始化两个链表,分别读取输入的多项式。 - 调用加法函数。 - 输出结果多项式。 这是一个简化版本的实现,实际操作可能会包括错误检查、用户输入处理和文件I/O操作。下面是部分关键代码示例: ```c PolynomialNode* readPolyFromFile(const char* filename) { PolynomialNode* head = NULL; FILE* file = fopen(filename, "r"); if (!file) { perror("Error opening file"); return NULL; } // 从文件中一行行读取系数和指数,并插入链表 // ... fclose(file); return head; } PolynomialNode* addPolynomials(PolynomialNode* poly1, PolynomialNode* poly2) { PolynomialNode* resultHead = NULL; // 遍历并相加两个多项式 // ... return resultHead; } int main() { PolynomialNode* poly1 = readPolyFromFile("poly1.txt"); // 文件名 PolynomialNode* poly2 = readPolyFromFile("poly2.txt"); // 文件名 PolynomialNode* result = addPolynomials(poly1, poly2); printPolynomial(result); // 清理内存 // ... return 0; } ``` 如果你想了解更多细节,比如如何从文件读取多项式,或者链表的插入和打印操作,可以继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值