反转链表是一种常见的链表操作,可以通过动态图来说明其过程:
假设有一个包含节点 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;
}