试写一算法,实现对单链表的就地逆置
时间: 2023-04-05 11:01:47 浏览: 264
好的,我可以回答这个问题。以下是对单链表的就地逆置的算法:
1. 定义三个指针:p, q, r,分别指向当前节点、前一个节点和后一个节点。
2. 将 p 指向链表的头节点。
3. 将 q 指向 NULL。
4. 循环遍历链表,直到 p 指向 NULL:
a. 将 r 指向 p 的下一个节点。
b. 将 p 的 next 指针指向 q。
c. 将 q 指向 p。
d. 将 p 指向 r。
5. 将链表的头节点指向 q。
这样就实现了对单链表的就地逆置。
相关问题
试用C写一算法对单链表就地逆置
当然可以。在C语言中,你可以使用迭代的方式来实现单链表的就地逆置(也称为反转)。这种方法不需要额外的空间存储节点,直接通过修改现有节点的指针来达到反转的效果。下面是一个简单的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 就地逆置链表函数
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表为空或者只有一个元素,无需反转
}
Node *prev = NULL, *current = *head, *nextTemp;
while (current != NULL) {
// 保存当前节点的下一个节点
nextTemp = current->next;
// 更新当前节点的next指向前一个节点
current->next = prev;
// 移动前驱、当前和后继指针
prev = current;
current = nextTemp;
}
*head = prev; // 最后,原头节点变成了新的尾节点
}
// 测试代码
int main() {
// 创建示例链表
Node* list = (Node*)malloc(sizeof(Node));
list->data = 1;
list->next = (Node*)malloc(sizeof(Node));
list->next->data = 2;
list->next->next = (Node*)malloc(sizeof(Node));
list->next->next->data = 3;
list->next->next->next = NULL;
printf("Original List: ");
Node* temp = list;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
reverseList(&list); // 反转链表
printf("Reversed List: ");
temp = list;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
free(list);
return 0;
}
用类C语言设计算法实现循环单链表就地逆置
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
void init(Node** head, int n) {
*head = (Node*)malloc(sizeof(Node));
(*head)->data = 1;
(*head)->next = NULL;
Node* ptr = *head;
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
ptr->next = newNode;
ptr = ptr->next;
}
ptr->next = *head; // 链接成循环链表
}
void printList(Node* head) {
Node* ptr = head;
do {
printf("%d ", ptr->data);
ptr = ptr->next;
} while (ptr != head);
}
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return;
}
Node* prev = NULL;
Node* cur = *head;
Node* nxt = (*head)->next;
do {
cur->next = prev;
prev = cur;
cur = nxt;
nxt = nxt->next;
} while (cur != *head);
(*head)->next = prev;
*head = prev;
}
int main() {
Node* head = NULL;
int n = 5;
init(&head, n);
printf("原始链表数据:\n");
printList(head);
reverseList(&head);
printf("\n逆置后的链表数据:\n");
printList(head);
return 0;
}备注:此算法实现了循环单链表的就地逆置,可供参考。
阅读全文