最优解为:三指针头插法,O(n)/O(1)
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head||!head->next)return head;
ListNode* pa=0;
ListNode* pb=head;
ListNode* pc=0;
while(pb){
pc=pb->next;
pb->next=pa;
pa=pb;
pb=pc;
}
return pa;
}
};
理解起来并不困难,但是会有一些细节。
比如说pc的出现,pc并不是要移动,而是随着pb的移动,pc一直作为pb的next存在,这样组成了三指针。
先对pc进行赋值,使链子不能断;
然后对pb进行next方向改变,使其指向pa;
最后依次不要pa和pb,这样不停的循环;
而最后退出的条件是pb是空,那么说明pa才是最后的表头。