链表反转
目录
一、题型解释
链表反转是将链表节点的连接方向完全逆序的操作。常见题型:
-
基础反转:反转整个单链表(如
1→2→3→4→5
转为5→4→3→2→1
)。 -
部分反转:反转链表的某个区间(如反转第2到第4个节点)。
-
分组反转:每k个节点为一组进行反转(如k=2时,
1→2→3→4→5
转为2→1→4→3→5
)。 -
递归反转:用递归思想实现链表反转。
二、例题问题描述
例题1:输入链表 1→2→3→4→5
,输出反转后的链表 5→4→3→2→1
。
例题2:输入链表 1→2→3→4→5
和区间 [2,4]
,输出 1→4→3→2→5
。
例题3:输入链表 1→2→3→4→5
和k=2,输出 2→1→4→3→5
。
例题4:输入链表 1→2
,输出 2→1
。
三、C语言实现
解法1:迭代反转(难度★)
通俗解释:
-
像翻书一样,逐个节点改变指针方向,将当前节点的next指向前一个节点。
c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
// 迭代反转链表
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head;
while (curr != NULL) {
struct ListNode *nextTemp = curr->next; // 保存下一个节点
curr->next = prev; // 当前节点指向前一个节点
prev = curr; // 前一个节点后移
curr = nextTemp; // 当前节点后移
}
return prev; // prev最终指向新链表的头节点
}
// 打印链表
void printList(struct ListNode* head) {
while (head != NULL) {
printf("%d→", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 构建链表 1→2→3→4→5
struct ListNode node5 = {5, NULL};
struct ListNode node4 = {4, &node5};
struct ListNode node3 = {3, &node4};
struct ListNode node2 = {2, &node3};
struct ListNode node1 = {1, &node2};
struct ListNode* newHead = reverseList(&node1);
printList(newHead); // 输出 5→4→3→2→1→NULL
return 0;
}
代码逻辑:
-
初始化指针:
prev
(前一个节点&#