单向链表的就地逆置

最近又遇到需要链表就地逆置的问题,之前也遇到过,时间一久便忘了如何做的了。经查找,觉得下面这种算法通过三个指针的变换实现单向链表的就地逆置,比较简洁且容易理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/

void (ListNode* head){
// head 是头结点 head->next 指向第一个结点
ListNode *p = head->next;
ListNode *q = head->next;
while(p){
ListNode *n = p->next;
p->next = n->next;
n->next = q;
q = n;
}
head->next = q;
}