C語言中單鏈表的反轉可以通過修改指針的指向來實現。具體的方法如下:
定義三個指針:prev、curr和next。初始時,prev指向NULL,curr指向鏈表的頭節點,next指向curr的下一個節點。
遍歷鏈表,直到curr指向NULL為止,循環執行以下操作: a. 將next指向curr的下一個節點,以便保留鏈表的連接關系。 b. 將curr的next指針指向prev,即將curr的指針方向反轉。 c. 將prev指向curr,以便保留反轉后的鏈表的頭節點。 d. 將curr指向next,以便繼續遍歷鏈表。
遍歷結束后,prev指向反轉后的鏈表的頭節點,即完成了鏈表的反轉。
以下是一個示例代碼:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
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() {
// 創建鏈表 1->2->3->4->5
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node5 = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = 1;
head->next = node2;
node2->val = 2;
node2->next = node3;
node3->val = 3;
node3->next = node4;
node4->val = 4;
node4->next = node5;
node5->val = 5;
node5->next = NULL;
// 反轉鏈表
struct ListNode *newHead = reverseList(head);
// 遍歷打印反轉后的鏈表
struct ListNode *current = newHead;
while (current != NULL) {
printf("%d ", current->val);
current = current->next;
}
return 0;
}
運行以上代碼,輸出結果為:5 4 3 2 1,即鏈表反轉成功。