有一个单链表l(至少有1个结点),其头结点指针为head,\n\n编写一个过程将l逆置,即最后一个结点变成第一个结点,\n\n原来倒数第二个结点变成第二个结点,如此等等。
时间: 2023-05-01 13:04:06 浏览: 169
此题是一道关于单向链表的问题,要求将链表的头结点变为尾结点,同时将倒数第二个结点变为最后一个结点。这个操作可以通过遍历链表到达链表尾部,记录下链表长度,再利用长度找到倒数第二个结点和尾结点,分别将它们的指针指向对应的位置即可。
相关问题
有一个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算数据域为x的结点个数。
可以编写一个函数,遍历整个单链表,统计数据域为x的结点个数。具体实现如下:
int countNode(Node* head, int x) {
int count = 0;
Node* p = head;
while (p != NULL) {
if (p->data == x) {
count++;
}
p = p->next;
}
return count;
}
其中,head是单链表的头指针,x是要查找的数据域值。count是计数器,初始值为0。p是遍历指针,初始值为head。在循环中,如果p指向的结点的数据域值等于x,则计数器加1。最后返回计数器的值,即为数据域为x的结点个数。
用c语言编写以head为头指针的带头结点的单链表,将结点x 插入第一个结点值为key的结点之前。
以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct node {
int data;
struct node *next;
} Node;
// 初始化链表
void initList(Node **head) {
*head = (Node *)malloc(sizeof(Node));
(*head)->next = NULL;
}
// 插入节点
void insert(Node *head, int key, int x) {
Node *p = head->next, *pre = head;
while (p != NULL && p->data != key) {
pre = p;
p = p->next;
}
if (p == NULL) {
printf("未找到key为%d的节点\n", key);
return;
}
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = x;
newNode->next = p;
pre->next = newNode;
}
// 打印链表
void printList(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head;
initList(&head);
int n, key, x;
printf("请输入节点个数:");
scanf("%d", &n);
printf("请输入节点数据:");
for (int i = 0; i < n; i++) {
int data;
scanf("%d", &data);
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head->next;
head->next = newNode;
}
printf("请输入要插入的节点数据和key:");
scanf("%d %d", &x, &key);
insert(head, key, x);
printf("插入后的链表为:");
printList(head);
return 0;
}
```
具体思路是在链表中遍历,找到第一个值为key的节点,然后在该节点之前插入一个新的节点,最后输出修改后的链表。需要注意的是,因为这是带头结点的单链表,所以头结点的数据域没有实际意义,不存储数据。
阅读全文