将一个链表A中的元素逆置。例如原来链表中A的元素是100,90,80,70,60,50,40,逆置以后为40,50,60,70,80,90,100
时间: 2024-11-26 09:05:04 浏览: 13
线性链表逆置_设有一线性表_线性链表逆置_
要将链表A中的元素逆置,可以使用迭代或递归的方法。以下是使用迭代方法的一种常见实现方式:
### 迭代方法
1. **初始化三个指针**:`prev`、`current` 和 `next`。
- `prev` 初始化为 `NULL`。
- `current` 初始化为链表的头节点。
- `next` 用于暂存当前节点的下一个节点。
2. **遍历链表**:
- 在每次迭代中,将 `current` 的 `next` 指针指向 `prev`,实现反转。
- 更新 `prev` 为 `current`,`current` 为 `next`,继续下一次迭代。
3. **结束条件**:当 `current` 为 `NULL` 时,表示已经遍历到链表末尾,此时 `prev` 即为新的头节点。
### 示例代码
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} ListNode, *LinkList;
// 创建链表(示例)
LinkList create_LinkList(int arr[], int n) {
LinkList head = NULL, tail = NULL;
for (int i = 0; i < n; i++) {
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
newNode->data = arr[i];
newNode->next = NULL;
if (head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 打印链表
void print_LinkList(LinkList L) {
ListNode *p = L;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 逆置链表
LinkList reverse_LinkList(LinkList L) {
ListNode *prev = NULL;
ListNode *current = L;
ListNode *next = NULL;
while (current != NULL) {
next = current->next; // 暂存当前节点的下一个节点
current->next = prev; // 当前节点的 next 指向 prev
prev = current; // prev 移动到当前节点
current = next; // current 移动到下一个节点
}
return prev; // 新的头节点
}
int main() {
int arr[] = {100, 90, 80, 70, 60, 50, 40};
int n = sizeof(arr) / sizeof(arr[0]);
LinkList L = create_LinkList(arr);
printf("原链表: ");
print_LinkList(L);
L = reverse_LinkList(L);
printf("逆置后的链表: ");
print_LinkList(L);
return 0;
}
```
### 输出结果
```
原链表: 100 90 80 70 60 50 40
逆置后的链表: 40 50 60 70 80 90 100
```
这个代码片段展示了如何创建一个链表,打印链表,以及如何逆置链表。通过这种方式,你可以轻松地将链表中的元素顺序反转。
阅读全文