c语言找出单向链表的中间结点并统计全部节点数
时间: 2024-05-12 14:18:10 浏览: 89
好的,这是一道关于单向链表的中间节点问题,需要遍历链表并记录节点数量。下面是代码示例:
```
typedef struct Node {
int data;
struct Node* next;
} Node;
// 找到单向链表的中间节点并统计节点数
void findMid(Node* head, int* count, int* mid) {
Node* slow = head;
Node* fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
(*count)++;
}
*mid = slow->data;
}
```
在上面的代码中,我们使用了两个指针 `slow` 和 `fast`,`slow` 指针每次移动一个节点,`fast` 指针每次移动两个节点。当 `fast` 指针到达链表末尾时,`slow` 指针正好指向链表的中间节点。我们使用一个变量 `count` 统计链表的节点数量,最终将链表的中间节点的值存储在变量 `mid` 中。
请注意,以上代码仅展示了如何处理单向链表的中间节点问题,对于其他的问题场景,需要根据不同的具体需求进行相应的修改和调整。
相关问题
用C语言写出单向链表查找节点的算法
以下是用 C 语言实现单向链表查找节点的算法示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 查找链表中第一个值为 val 的节点,返回该节点的指针,如果不存在则返回 NULL
struct ListNode* findNode(struct ListNode* head, int val) {
// 遍历链表
while (head != NULL) {
// 如果当前节点的值为 val,则返回该节点的指针
if (head->val == val) {
return head;
}
// 否则,继续遍历下一个节点
head = head->next;
}
// 链表中不存在值为 val 的节点,返回 NULL
return NULL;
}
int main() {
// 创建链表的头结点
struct ListNode* head = (struct ListNode*) malloc(sizeof(struct ListNode));
head->val = 1;
head->next = NULL;
// 添加新节点
struct ListNode* node1 = (struct ListNode*) malloc(sizeof(struct ListNode));
node1->val = 2;
node1->next = NULL;
head->next = node1;
// 添加新节点
struct ListNode* node2 = (struct ListNode*) malloc(sizeof(struct ListNode));
node2->val = 3;
node2->next = NULL;
node1->next = node2;
// 查找链表中值为 2 的节点
struct ListNode* node = findNode(head, 2);
if (node != NULL) {
printf("找到了节点,节点的值为 %d\n", node->val);
} else {
printf("未找到节点\n");
}
// 释放链表节点的内存
free(node1);
free(node2);
free(head);
return 0;
}
```
用C语言实现建立单向链表,表长任意;可交互输出单链表中的内容;编写算法计算出自己所建立的单链表的长度并输出;删除自己所建单链表中的第K个节点,并将剩余节点输出;将单链表倒排,输出结果。
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 创建链表
Node *createLinkedList() {
Node *head = (Node *) malloc(sizeof(Node)); // 创建头结点
Node *p = head; // p指向当前节点
int value;
printf("请输入链表中的元素,以-1结束:");
while (1) {
scanf("%d", &value);
if (value == -1) {
break;
}
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->data = value;
p->next = newNode;
p = p->next;
}
p->next = NULL; // 尾节点指向NULL
return head;
}
// 输出链表中的元素
void printLinkedList(Node *head) {
Node *p = head->next; // p指向第一个元素节点
printf("链表中的元素为:");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 计算链表长度
int getLinkedListLength(Node *head) {
int count = 0;
Node *p = head->next; // p指向第一个元素节点
while (p != NULL) {
count++;
p = p->next;
}
return count;
}
// 删除链表中的第k个元素
void deleteNodeFromLinkedList(Node *head, int k) {
int count = 0;
Node *p = head;
while (p != NULL && count < k - 1) { // 找到待删除节点的前一个节点
count++;
p = p->next;
}
if (p == NULL || p->next == NULL) { // 未找到待删除节点或待删除节点为尾节点
printf("删除失败!\n");
return;
}
Node *q = p->next; // q指向待删除节点
p->next = q->next; // 将待删除节点的前一个节点指向待删除节点的后一个节点
free(q); // 释放待删除节点的空间
printf("删除成功!\n");
}
// 将链表倒排
void reverseLinkedList(Node *head) {
Node *p = head->next; // p指向第一个元素节点
Node *q = p->next; // q指向第二个元素节点
p->next = NULL; // 将第一个元素节点作为新链表的尾节点
while (q != NULL) {
Node *r = q->next; // r指向q节点的后一个节点
q->next = p; // 将q节点指向p节点
p = q; // p指向q节点
q = r; // q指向r节点
}
head->next = p; // 将头结点指向新链表的第一个元素节点
}
int main() {
Node *head = createLinkedList(); // 创建链表
printLinkedList(head); // 输出链表中的元素
int length = getLinkedListLength(head); // 计算链表长度
printf("链表长度为:%d\n", length);
int k;
printf("请输入要删除的节点的位置:");
scanf("%d", &k);
deleteNodeFromLinkedList(head, k); // 删除链表中的第k个元素
printLinkedList(head); // 输出链表中的元素
reverseLinkedList(head); // 将链表倒排
printLinkedList(head); // 输出链表中的元素
return 0;
}
```
阅读全文