本题要求计算单链表倒数n个结点的乘积。例如,给出单链表1 2 3 4 5,则倒数2个结点的乘积为20。c语言
时间: 2024-06-15 09:08:23 浏览: 133
要计算单链表倒数n个结点的乘积,可以使用双指针的方法来实现。首先,定义两个指针p和q,初始时都指向链表的头结点。然后,将指针q向后移动n个位置,使得p和q之间的距离为n。接下来,同时移动p和q指针,直到q指针到达链表的末尾。此时,p指针所指向的结点就是倒数第n个结点。遍历p指针到链表末尾的过程中,累乘每个结点的值,即可得到倒数n个结点的乘积。
下面是C语言的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
struct ListNode {
int val;
struct ListNode *next;
};
int getProductOfLastN(struct ListNode *head, int n) {
// 定义双指针p和q
struct ListNode *p = head;
struct ListNode *q = head;
// 将q指针向后移动n个位置
for (int i = 0; i < n; i++) {
if (q == NULL) {
// 如果链表长度小于n,则返回0
return 0;
}
q = q->next;
}
// 同时移动p和q指针,直到q指针到达链表末尾
while (q != NULL) {
p = p->next;
q = q->next;
}
// 计算倒数n个结点的乘积
int product = 1;
while (p != NULL) {
product *= p->val;
p = p->next;
}
return product;
}
int main() {
// 创建链表1->2->3->4->5
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = 1;
head->next = (struct ListNode *)malloc(sizeof(struct ListNode));
head->next->val = 2;
head->next->next = (struct ListNode *)malloc(sizeof(struct ListNode));
head->next->next->val = 3;
head->next->next->next = (struct ListNode *)malloc(sizeof(struct ListNode));
head->next->next->next->val = 4;
head->next->next->next->next = (struct ListNode *)malloc(sizeof(struct ListNode));
head->next->next->next->next->val = 5;
head->next->next->next->next->next = NULL;
int n = 2; // 倒数n个结点
int result = getProductOfLastN(head, n);
printf("倒数%d个结点的乘积为:%d\n", n, result);
// 释放链表内存
struct ListNode *temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
阅读全文