反转链表是一种常见的链表操作,可以通过动态图来说明其过程:
假设有一个包含节点 A -> B -> C -> D -> E 的链表,要将其反转成 E -> D -> C -> B -> A。
初始状态:
A -> B -> C -> D -> E
创建指向当前节点和前一节点的指针变量,初始时分别指向 NULL 和 A:
NULL <- A B -> C -> D -> E
开始遍历链表,依次反转每个节点的指针方向:
- 第一步:将当前节点B的 next 指针指向前一节点A,更新指针变量,移动到下一个节点:
NULL <- A B C -> D -> E
- 第二步:将当前节点C的 next 指针指向前一节点B,更新指针变量,移动到下一个节点:
NULL <- A <- B C D -> E
- 依此类推,直到将整个链表都反转为:
NULL <- A <- B <- C <- D E
- 第一步:将当前节点B的 next 指针指向前一节点A,更新指针变量,移动到下一个节点:
最终链表的状态变为:
E -> D -> C -> B -> A
通过动态图示意反转链表的过程,有助于更直观地理解链表节点指针的修改和移动。希望这样的说明对您有帮助。如果需要进一步解释或有其他问题,请随时告诉我。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node, *LinkedList;
// 创建一个新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Error! Unable to create a new node.\n");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表末尾添加新节点
void append(LinkedList* head, int data) {
if (*head == NULL) {
*head = createNode(data);
}
else {
Node* lastNode = *head;
while (lastNode->next != NULL) {
lastNode = lastNode->next;
}
lastNode->next = createNode(data);
}
}
// 打印链表
void printList(LinkedList head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
// 反转链表
LinkedList reverseList(LinkedList head) {
Node* prev = NULL;
Node* curr = head;
while (curr != NULL) {
Node* nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
int main() {
LinkedList head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
append(&head, 4);
append(&head, 5);
printf("Original List: ");
printList(head);
head = reverseList(head);
printf("Reversed List: ");
printList(head);
return 0;
}