将链表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。数据结构链表
时间: 2023-06-01 14:03:33 浏览: 96
链表的逆置(数据结构)
实现链表逆置的一种常见方法是使用三个指针来迭代地翻转链表。具体步骤如下:
1. 定义三个指针:prev,curr和next。初始时,prev指向空,curr指向头结点,next指向curr的下一个结点。
2. 迭代地遍历链表,对于每个结点,执行以下操作:
a. 将curr的next指针指向prev,实现逆置。
b. 将prev指针指向curr。
c. 将curr指针指向next。
d. 将next指针指向curr的下一个结点。
3. 遍历到链表末尾时,prev指向原链表的最后一个结点,curr指向空。此时,将头结点指向prev,完成链表逆置。
下面是一个基于C语言的链表逆置的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
/* 链表结点 */
struct ListNode {
int val;
struct ListNode *next;
};
/* 创建链表 */
struct ListNode *createList(int *nums, int size) {
if (size == 0) {
return NULL;
}
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = nums[0];
head->next = NULL;
struct ListNode *tail = head;
for (int i = 1; i < size; i++) {
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = nums[i];
node->next = NULL;
tail->next = node;
tail = node;
}
return head;
}
/* 销毁链表 */
void destroyList(struct ListNode *head) {
while (head != NULL) {
struct ListNode *node = head;
head = head->next;
free(node);
}
}
/* 打印链表 */
void printList(struct ListNode *head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
/* 链表逆置 */
struct ListNode *reverseList(struct ListNode *head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
while (curr != NULL) {
struct ListNode *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
/* 测试 */
int main() {
int nums[] = {1, 2, 3, 4, 5};
int size = sizeof(nums) / sizeof(nums[0]);
struct ListNode *list = createList(nums, size);
printf("Original list: ");
printList(list);
struct ListNode *reversed = reverseList(list);
printf("Reversed list: ");
printList(reversed);
destroyList(reversed);
return 0;
}
```
阅读全文