ListNode *reverse(ListNode *L)
{
ListNode *prev=NULL,*curr=L,*next=NULL;//前驱节点,当前节点,下一个节点
while(curr!=NULL)
{
next=curr->next;//下一个节点
curr->next=prev;//把当前节点的next域指向前驱节点
prev=curr;//前驱节点向后移动到当前节点
curr=next;//当前节点向后移动到下一个节点
}
return prev;//最后curr指向了null,prev变成了新的头结点
}
初始状态
假设链表为 1 -> 2 -> 3 -> 4 -> 5 -> NULL
,初始时:
-
head
指向节点1
。 -
prev
初始化为NULL
。 -
curr
初始化为head
,即指向节点1
。 -
next
初始化为NULL
。
链表状态:
复制
1 -> 2 -> 3 -> 4 -> 5 -> NULL
第一次循环
-
next = curr->next
:-
curr
指向节点1
,curr->next
是节点2
。 -
将
next
指向节点2
。
-
-
curr->next = prev
:-
prev
是NULL
,将curr->next
指向NULL
。 -
现在节点
1
的next
指针被修改为NULL
。
-
-
prev = curr
:-
将
prev
指向当前节点1
。
-
-
curr = next
:-
将
curr
指向节点2
。
-
链表状态:
复制
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
第二次循环
-
next = curr->next
:-
curr
指向节点2
,curr->next
是节点3
。 -
将
next
指向节点3
。
-
-
curr->next = prev
:-
prev
指向节点1
,将curr->next
指向节点1
。 -
现在节点
2
的next
指针被修改为指向节点1
。
-
-
prev = curr
:-
将
prev
指向当前节点2
。
-
-
curr = next
:-
将
curr
指向节点3
。
-
链表状态:
复制
NULL <- 1 <- 2 3 -> 4 -> 5 -> NULL
第三次循环
-
next = curr->next
:-
curr
指向节点3
,curr->next
是节点4
。 -
将
next
指向节点4
。
-
-
curr->next = prev
:-
prev
指向节点2
,将curr->next
指向节点2
。 -
现在节点
3
的next
指针被修改为指向节点2
。
-
-
prev = curr
:-
将
prev
指向当前节点3
。
-
-
curr = next
:-
将
curr
指向节点4
。
-
链表状态:
复制
NULL <- 1 <- 2 <- 3 4 -> 5 -> NULL
第四次循环
-
next = curr->next
:-
curr
指向节点4
,curr->next
是节点5
。 -
将
next
指向节点5
。
-
-
curr->next = prev
:-
prev
指向节点3
,将curr->next
指向节点3
。 -
现在节点
4
的next
指针被修改为指向节点3
。
-
-
prev = curr
:-
将
prev
指向当前节点4
。
-
-
curr = next
:-
将
curr
指向节点5
。
-
链表状态:
复制
NULL <- 1 <- 2 <- 3 <- 4 5 -> NULL
第五次循环
-
next = curr->next
:-
curr
指向节点5
,curr->next
是NULL
。 -
将
next
指向NULL
。
-
-
curr->next = prev
:-
prev
指向节点4
,将curr->next
指向节点4
。 -
现在节点
5
的next
指针被修改为指向节点4
。
-
-
prev = curr
:-
将
prev
指向当前节点5
。
-
-
curr = next
:-
将
curr
指向NULL
。
-
链表状态:
复制
NULL <- 1 <- 2 <- 3 <- 4 <- 5
循环结束
-
curr
变为NULL
,循环终止。 -
prev
指向节点5
,即新的头节点。
最终链表
反转后的链表为:
复制
5 -> 4 -> 3 -> 2 -> 1 -> NULL
总结
-
核心思想:通过三个指针(
prev
、curr
、next
)逐个修改节点的next
指针方向。 -
时间复杂度:O(n)O(n),只需遍历链表一次。
-
空间复杂度:O(1)O(1),只使用了常数级别的额外空间。
通过这种方式,链表被成功反转!